php框架如何保护动作脚本/数据服务文件


How do php frameworks protect action script/dataservice files?

我想知道框架是如何阻止用户直接访问操作/数据服务脚本的。

例如,我们转到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,他们将看不到源代码,只看到源代码的输出)。

如果不允许用户直接看到该脚本的输出,您可以选择以下几种方法之一:

  1. 将所有受保护的脚本放在HTTP服务器的docroot外部,然后使用..引用它们/包括或类似
  2. 使用apache访问控制文件来拒绝对.php的请求(在传递时将其切断)
  3. 制作一个名为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总是存在的。