0

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

例如我们去www.test.com/test.html模板test.html调用test_action.php。是什么阻止用户访问此操作脚本直接所在的目录?

www.test.com/index/actions/test_action.php

服务器权限是如何配置的,所以test_action.php只能通过test.html.

  • 在我被困在共享托管服务器上的 doc-root 中的情况下
  • 在我运行节目的情况下〜IE我的apache服务器
4

2 回答 2

2

如果您什么都不做,并且 test_action.php 在您的 docroot 下,则用户可以访问它。有几种方法可以解决这个问题,如果这是不可接受的(请注意,如果您的服务器正确安装/配置了 PHP,他们将不到源代码,只会看到源代码的输出)。

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

  1. 将所有受保护的脚本放在 HTTP 服务器的 docroot之外,然后使用 ../includes 或类似方法引用它们
  2. 使用 apache 访问控制文件拒绝对 .php 的请求(在传递时将其切断)。
  3. 创建一个名为entry.php声明全局常量的文件,然后首先从所有有效入口点包含该文件,然后在每个受保护的脚本中检查该常量的存在(IIRC,这就是 CodeIgniter 所做的)。

一般推荐#1。如果这不好,#2 非常有效,#3 是,IMO,只是俗气。

于 2012-07-06T16:16:24.340 回答
2

既然你问php框架如何处理这个问题,有两种常见的方法:

  • 正确的方法

    将所有代码保留在DOCUMENT_ROOT. 基本上你有一个/public文件夹,其中只包含index.php,然后包含include '../application/init.php'.

    所有其他 php 文件都放在外面DOCUMENT_ROOT,不能直接访问。

  • 愚蠢的方式

    他们在文件中定义了一个常量index.php,所有其余文件都以:

      defined('SOMETHING') or die('No direct script access.');
    

    如果服务器上的 php 扩展程序发生故障,这显然会失败。您最终会得到所有人都可以看到的 php 源代码。

顺便说一句,我不建议使用任何特定于 apache 的方式来处理此问题,因为您无法确定您的框架将在哪个网络服务器上使用。NginX 和 Lighttpd 都变得非常流行。也总是有 IIS。

于 2012-07-06T16:22:40.867 回答