尽管我努力寻找有关如何为使用 PHP 构建的 Web 应用程序设置安全、单一入口点架构的教程,但我一直未能找到一个好的教程。谁知道呢,也许我的搜索查询很糟糕......查看 Laravel 的代码似乎是个好主意,但它是让你头晕目眩的好方法。那里发生的事情太多了,我无法理解。
话虽如此,我将如何创建这样一个既易于应用于应用程序又安全(例如防止本地文件包含)的架构?
尽管我努力寻找有关如何为使用 PHP 构建的 Web 应用程序设置安全、单一入口点架构的教程,但我一直未能找到一个好的教程。谁知道呢,也许我的搜索查询很糟糕......查看 Laravel 的代码似乎是个好主意,但它是让你头晕目眩的好方法。那里发生的事情太多了,我无法理解。
话虽如此,我将如何创建这样一个既易于应用于应用程序又安全(例如防止本地文件包含)的架构?
首先,您需要将所有请求重定向到一个 PHP 文件。您在 Apache 上的.htaccess或其他服务器上的对应部分中执行的那部分。
然后,您需要探索可以在 中看到哪些数据$_SERVER
。使用它很常见$_SERVER['PATH_INFO']
,但选择将取决于您如何准确地重写请求。
然后你需要创建一个路由器,它有一个正则表达式列表并尝试匹配你获得的 URL 片段。
这里有几个例子可能会给你一些想法:
'#^/(?P<page>[^/\\\\.,;?\n]+)$#'
'#^/user/(?P<id>[0-9]+)/(?P<nickname>[^/\.,;?\n]+)$#'
'#^(?:/test/(?P<parameter>[^/\\\\.,;?\n]+))?/mandatory$#'
通常的做法是从更简单的符号生成这些正则表达式,但是对于第一次迭代,您不应该过多地关注它。
此外,如果您使用具有可选片段的表达式,您还应该提供“后备”值。如果未提供片段,但模式匹配,则这些值将用作默认值。
我做这一切的方式在 PHP 中是这样的:
/*
* Routing mechanism
*/
$uri = isset( $_SERVER[ 'PATH_INFO' ] )
? $_SERVER[ 'PATH_INFO' ]
: '/';
$builder = new RequestBuilder;
$request = $builder->create();
$request->setUri( $uri );
$router = new Router( new RouteBuilder );
$router->import(
$reader->getAsArray( __DIR__ . '/config/routes.json' )
);
$router->route( $request );
在此之后,变量包含一个对象,然后您可以使用类似或$request
的命令查询特定参数。$id = $request->getParameter('id')
$controller = $request->getParameter('controller')
如果您不弄乱模式本身,那么您提取的值将不会受到未经授权的文件包含的影响。