【问题标题】:How do I make certain files accessible just for PHP scripts?如何使某些文件仅可用于 PHP 脚本?
【发布时间】:2011-04-23 00:34:24
【问题描述】:

我正在构建一个 CMS,而主页 (index.php) 是由 CMS 目录中的许多小文件构建的。例如,结构可能是这样的:

index.php
menu/admin/content.php
           config.php
           requests.php

menu/tools/content.php
           config.php
           requests.php

menu/users/content.php
           config.php
           requests.php

当我访问根目录中的index.php 时,我会根据$_GET 参数得到不同的结果。例如,当我访问index.php?section=tools 时,索引文件会从menu/tools/ 文件夹中加载contentcofnigrequests 文件。

现在解决问题。 index.php 页面本身仅供登录用户访问,但出于安全原因,我想禁止通过任何其他方式访问 menu 文件夹中的所有内容,而不是通过 php 的包含函数。

为了演示可能发生的情况:如果我想删除某些内容,我使用index.php?section=tools&delete=5,在menu/tools/requests.php 文件中,我会检查是否设置了$_GET['delete'],然后从数据库中删除ID 5。现在的问题是,如果有人知道实际结构,他可以像这样访问requests.php 文件:site.com/admin/menu/tools/requests.php?delete=5,然后以这种方式入侵该网站。

有没有办法防止这种可能的攻击?拒绝访问菜单文件夹中的文件,但仍然允许从我的 index.php 文件访问它们? Htaccess 也许?我真的不想对“菜单”文件夹中的每个文件进行检查(如果设置了会话/cookie),尽管这是一个可能的解决方案。

【问题讨论】:

  • index.php?section=tools&delete=5 本身就是一个坏主意。我现在找不到参考资料,但我读到过一个案例,说整个网站被一个仁慈的机器人破坏了,因为每个项目都有一个“删除”链接。请改用 POST 请求。

标签: php session .htaccess cookies


【解决方案1】:

在您不想拒绝访问的文件夹中创建一个 .htaccess,其中包含以下内容:

deny from all

不过,最好将文件夹放在 Web 根目录之外。

【讨论】:

  • 那么,在使用普通托管服务时,有没有办法将文件放在根目录之外?
  • 应该有,虽然一些(坏的)共享主机只允许你访问网络根目录。
  • 好吧,我尝试了“拒绝所有人”,效果很好。只是我不确定的一件事,如果有 .htaccess 规则,是否有办法让外部人员访问该文件?例如,如果他要使用 CURL 或类似的东西?
【解决方案2】:

最好的方法是将menu 文件夹移动到网络服务器文档根目录之外的某个位置。这样一来,没有 URL 映射到 menu/tools/requests.php,您唯一的安全问题就是您在 index.php 中所做的事情

【讨论】:

  • 好吧,或者我可以将“menu”文件夹重命名为“menu145235234952”或类似的名称,并更改每个项目的编号,但这似乎不是一个干净的解决方案。我真的不知道我会把它搬到哪里,我总是使用托管服务。
  • 应该是可以的。有关详细信息,请咨询您的托管服务提供商。
  • @Mike:是的,请咨询您的提供商,您应该至少可以访问您帐户的$HOME,它通常包含存储您的 webroot 的文件夹。如果他们不提供这种访问权限,这可能是一个好兆头,您应该更换提供商 :-)
  • 嗯,.htaccess 中的 "DENY FROM ALL" 会不会与将其放入无法访问的文件夹中的效果相同?
  • 这取决于网络服务器的配置。考虑到您使用的是托管服务,因此您对网络服务器的配置没有任何影响,我不会依赖网络服务器的配置来处理安全关键问题。
【解决方案3】:

首先,如果有人要手动添加 GET 参数并“破解”该站点,则会出现问题。在脚本中,您应该验证尝试执行这些操作的用户的身份验证,如果他们通过了身份验证,那么应该没有问题。我认为没有人会在通过 GET 参数删除某些内容时遇到问题,因为他们可以自己在界面上执行此操作。

按照您的要求,有一些解决方案,但它们都有自己的顾虑......

CodeIgniter 通过设置一个变量,然后在每个脚本的头部工作,

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

您还可以检查 $_SERVER['SCRIPT_FILENAME']、$_SERVER['SCRIPT_NAME'] 或 $_SERVER['PHP_SELF'] 以查看其 index.php 是否存在,否则退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 2021-06-16
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多