我想知道框架是如何阻止用户直接访问操作/数据服务脚本的。
例如,我们转到www.test.com/test.html
模板test.html
调用test_action.php
。是什么阻止用户转到该操作脚本直接所在的目录?
如www.test.com/index/actions/test_action.php
如何配置服务器权限,以便test_action.php
只能通过test.html
访问。
- 在我被困在共享托管服务器上的文档根目录中的情况下
- 在我运行节目的情况下~I.E.我的apache服务器
如果你什么都不做,并且test_action.php在你的docroot下,用户可以访问它。有几种方法可以处理这个问题,如果这是不可接受的(请注意,如果你的服务器正确安装/配置了php,他们将看不到源代码,只看到源代码的输出)。
如果不允许用户直接看到该脚本的输出,您可以选择以下几种方法之一:
- 将所有受保护的脚本放在HTTP服务器的docroot外部,然后使用..引用它们/包括或类似
- 使用apache访问控制文件来拒绝对.php的请求(在传递时将其切断)
- 制作一个名为
entry.php
的文件,声明一个全局常量,然后首先从所有有效入口点中包含该文件,然后在每个受保护的脚本中检查该常量的存在(IIRC,这就是CodeIgniter所做的)
一般情况下,建议使用#1。如果这不好的话,#2是非常有效的,#3是,IMO,只是俗气。
由于您询问php框架如何处理此问题,因此有两种常见的方法:
-
正确的方式:
将所有代码保留在
DOCUMENT_ROOT
之外。基本上,您有一个/public
文件夹,它只包含index.php
,然后包含include '../application/init.php
'。所有其他php文件都位于
DOCUMENT_ROOT
之外,不能直接访问。 -
愚蠢的方式
他们在
index.php
文件中定义了一个常量,其余所有文件都以开头defined('SOMETHING') or die('No direct script access.');
如果服务器上的php扩展进入tits-up,这显然会失败。最终,您的php源代码将对所有人可见。
BTW,我不建议使用任何特定于apache的方式来处理这个问题,因为你不能确定你的框架将在哪个Web服务器上使用。NginX和Lighttpd都变得相当流行。IIS总是存在的。