2

尽管我努力寻找有关如何为使用 PHP 构建的 Web 应用程序设置安全、单一入口点架构的教程,但我一直未能找到一个好的教程。谁知道呢,也许我的搜索查询很糟糕......查看 Laravel 的代码似乎是个好主意,但它是让你头晕目眩的好方法。那里发生的事情太多了,我无法理解。

话虽如此,我将如何创建这样一个既易于应用于应用程序又安全(例如防止本地文件包含)的架构?

4

1 回答 1

5

首先,您需要将所有请求重定向到一个 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')

如果您不弄乱模式本身,那么您提取的值将不会受到未经授权的文件包含的影响。

于 2013-08-24T07:26:07.123 回答