【问题标题】:Disable PHP execution in one directory在一个目录中禁用 PHP 执行
【发布时间】:2017-10-05 16:40:43
【问题描述】:

为了防止 PHP 本地文件包含攻击,我想完全禁用一个目录中所有 PHP 文件的执行。在 .htcaccess 文件中使用行 php_flag engine off 将导致 500 错误。根据another question,这是由于 PHP 的安装方式造成的。

如果无法更改 PHP 安装,还有其他方法可以阻止 PHP 执行吗?

更新:文件不一定以 .php 结尾。

【问题讨论】:

  • 那么当用户访问该目录中的 PHP 文件时,您希望发生什么?它是否像纯文本文件一样返回?
  • 仅适用于扩展名为.php的文件?
  • 无论如何用户都不能直接访问这些文件。除此之外,我只想阻止所有文件的执行(不仅仅是那些以 .php 结尾的文件),因此它们也不能从另一个 php 文件中执行。

标签: php .htaccess security


【解决方案1】:

<?php 标头下面添加这个,这将阻止php 的直接执行

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

【讨论】:

  • 此(或类似代码)适用于库和包含文件。但是,如果文件是用户生成的内容(这是您想要关闭 PHP Händler 的正常情况),这将无济于事。
  • 为什么不在生成的内容中包含这个。他在问是否有“其他方式”来阻止 PHP 执行。
  • 因为告诉攻击者只上传无法执行的 PHP 脚本有点困难——我猜。
【解决方案2】:

您正在通过“允许所有,然后拒绝”逻辑来构建您的网站。您应该使用“全部拒绝,然后允许”的逻辑来构建它。例如,您告诉 Apache 为特定目录中的所有文件提供服务,然后您覆盖该配置以告诉 Apache 不提供该目录中的某些文件。即,您可能有这样的事情:

<VirtualHost *:80>
    ServerName foo.com
    DocumentRoot "/path/to/files"
</VirtualHost>

使用这样的目录布局:

/path/to/files
    index.php
    config.php
/path/to/files/lib
    db.php
    etc.php
    other_thing.php

使用此设置,任何人都可以直接请求 http://foo.com/config.phphttp://foo.com/lib/etc.php,这正是您要阻止的。与其为您要拒绝的所有内容添加单独的例外,不如从相反的方向开始。即,如果您有不想提供的文件,则不要将它们放在文档根目录中

<VirtualHost *:80>
    ServerName foo.com
    DocumentRoot "/path/to/files/public"
</VirtualHost>

注意 DocumentRoot 现在设置为项目中的子目录。仅将您的公共资产放在此目录中。所有其他文件都在公共之外(即上面)公开,因此 不能 由 Apache 提供服务,同时仍然允许 PHP 包含它们。

/path/to/files
    config.php
/path/to/files/lib
    db.php
    etc.php
    other_thing.php
/path/to/files/public
    index.php

【讨论】:

  • 谢谢,但我认为这并不能解决其他 php 文件包含的问题。我不只是想停止公共访问,我已经这样做了。我明确希望防止 php 文件被执行(例如,通过其他 php 文件的“include()”)
  • 你不能那样做。它们需要可读才能在您的应用中运行。
  • 我不希望它们在我的应用中运行
  • 如果您的应用不需要它们,则删除它们。
  • 如果您的应用程序需要读取它们,那么您不能阻止 PHP 尝试从 include() 中执行它们。如果您想避免它们被执行的可能性,请将它们放在没有安装 PHP 的静态服务器(或虚拟主机)上。
【解决方案3】:

将此添加到您的 .htaccess 文件中

<FilesMatch \.php$>
    SetHandler None
</FilesMatch>

【讨论】:

  • 请注意,如果直接通过 HTTP 请求 .php 文件,这(仅)会阻止代码执行。如果 PHP 文件是 include()'d 或被服务器上的其他脚本调用,它不一定会阻止 PHP 文件在该目录中执行。
  • 我更新了我的问题,所以很明显文件没有 php 结尾。可以修改此答案以从文件中删除所有处理程序吗?我想要对文件做的唯一事情就是创建、读取和删除它们。它们不应该以任何方式访问或执行。
  • PHP 是解释的,而不是编译的——所以可读和可执行之间没有区别。
  • 嗯,不同之处在于解释器需要处理它们......这是我想要完全阻止的。
  • 能够读取文件和能够通过解释器处理文件没有区别。你不能允许一个而阻止另一个。
猜你喜欢
  • 2015-05-27
  • 2018-04-09
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多