Mik*_*ore 6 php theory security
我今年夏天已经设置了两个不同的PHP系统.每个使用两种不同的方法:
方法#1:每个任务一个PHP文件
此方法要求PHP为每个主要任务创建一个文件.例如,我的上传脚本将通过访问http://www.domain.com/upload.php.在upload.php,实例化和使用"控制器"和"视图"类.例如,upload.php可能看起来像这样:
<?php
require_once PATH_LIBRARY . 'control/Uploader.class.php';
require_once PATH_LIBRARY . 'view/UploaderPage.class.php';
$uploader = new Uploader();
$uploader->setView(new UploaderPage());
$uploader->init();
?>
Run Code Online (Sandbox Code Playgroud)
在上面的脚本中,如果我想调用另一个脚本,我只需重定向并附加必要的URL编码变量(header('Location: edit_details.php?image_id=456');).
方法#2:index.php处理所有请求的主文件
此方法不要求PHP为每个主要任务创建文件.相反,将在系统中使用的每个"控制器"类都使用index.php我调用的唯一类进行注册Router.路由器决定指定的Controller是合法的还是非法的并且相应地起作用(将浏览器路由到正确的控制器).例如,index.php脚本的简化版本:
<?php
require_once 'bootstrap.inc';
require_once PATH_LIBRARY . 'router/Router.class.php';
$router = new Router();
$router->register('Uploader', PATH_LIBRARY . 'control/Uploader.class.php');
$router->register('DetailsEditor', PATH_LIBRARY . 'control/DetailsEditor.class.php');
$router->route();
?>
Run Code Online (Sandbox Code Playgroud)
因此,每一个行动都发生在index.php.不需要很多文件,这些文件没有做太多其他实例化特定视图和控制器类的文件.但是,如果你想从脚本/类B调用脚本/类A,那么你需要在URL上传递控制器类的名称:header('Location: index.php?controller=DetailsEditor&image_id=456').
到目前为止,我真的不喜欢我需要在URL中包含Controller名称的事实.我觉得它将我的底层系统暴露给最终用户.但是,我确实喜欢我可以在一个页面上注册所有控制器类的事实.大多数情况下,我不知道暴露控制器名称是否安全.另一个烦恼是,如果我想通过POST请求调用脚本,我必须包含一个指定所需控制器类的隐藏输入(例如<input type="hidden" name="controller" value="DetailsEditor" />).
我希望这足以继续下去.我很紧张第二种方法在未来几个月里并没有真正为我服务.我很快就会选择一个或另一个.
谢谢.
没那么快。每个操作一个 PHP 文件的方法可能更快更好。这取决于你如何设置。
Web 服务器将根据文件名将 HTTP 请求路由到正确的处理程序。为什么要重新发明它?
大多数时候,“处理程序”所需的只是:
<?php include "everything.php";
// do some work
// Bounce the browser to a "view" url or display an error.
Run Code Online (Sandbox Code Playgroud)
这至少是简洁的。