使用 .htaccess 在目录(包括所有子目录)中禁用 PHP

Posted

技术标签:

【中文标题】使用 .htaccess 在目录(包括所有子目录)中禁用 PHP【英文标题】:Disable PHP in directory (including all sub-directories) with .htaccess 【发布时间】:2010-11-19 07:18:13 【问题描述】:

我正在制作一个允许人们上传文件、html 页面等的网站...现在我遇到了问题。我有一个这样的目录结构:

-/USERS
    -/DEMO1
    -/DEMO2
    -/DEMO3
    -/etc... (every user has his own direcory here)
-index.php
-control_panel.php
-.htaccess

现在我想禁用 PHP,但在 /USERS 内的目录和子目录中启用服务器端包含

这可以做到吗(以及如何:))?提前致谢。

顺便说一句,我使用 WAMP 服务器

【问题讨论】:

【参考方案1】:

尝试在您的 .htaccess 文件中禁用 engine option:

php_flag engine off

【讨论】:

@Lance Rushing:文件的内容将被发送给客户端。但是您为什么不自己尝试一下,看看会发生什么? 请注意,如果 PHP 未安装为 mod_php,这将给出 500 错误。将其包裹在 <IfModule mod_php5.c> ... </IfModule> 中。 可以改用php_admin_flag,这不能在.htaccess文件中使用。任何使用 php_admin_value 设置的指令类型都不能被 .htaccess 或 ini_set() 覆盖。要清除先前设置的值,请​​使用 none 作为值。 但是有人可以创建一个子目录并在新的 .htaccess 中放置一个“php_flag 引擎”,然后从这个子目录运行 PHP 代码吗? 我完全不推荐使用这个。正如一些人所指出的,这允许人们下载您的 PHP 文件的内容。在我看来,这是非常不安全的,永远不应该这样做。【参考方案2】:

要禁用对子目录的所有访问(最安全),请使用:

<Directory full-path-to/USERS>
     Order Deny,Allow
     Deny from All
 </Directory>

如果您只想阻止直接提供 PHP 文件,请执行以下操作:

1 - 确保您知道服务器识别为 PHP 的文件扩展名(并且不允许人们在 htaccess 中覆盖)。我的一台服务器设置为:

# Example of existing recognized extenstions:
AddType application/x-httpd-php .php .phtml .php3

2 - 基于扩展添加一个正则表达式到 FilesMatch(或 LocationMatch)

 <Directory full-path-to/USERS>
     <FilesMatch "(?i)\.(php|php3?|phtml)$">
            Order Deny,Allow
            Deny from All
    </FilesMatch>
 </Directory>

或者使用Location来匹配php文件(我更喜欢上面的文件方式)

<LocationMatch "/USERS/.*(?i)\.(php3?|phtml)$">
     Order Deny,Allow
     Deny from All
</LocationMatch>

【讨论】:

“不允许人们在 htaccess 中覆盖”,是的,这是一个非常好的方法。如果人们可以简单地用本地 htaccess 文件覆盖它,那么 htaccess 中的所有工作都将被浪费。您的演示环境可能对 php 文件没有用处,因此您最好根本不允许创建或提供它们(甚至不包括源代码视图),只需完全阻止它们(包括 htaccess 文件) 优秀的评论,我忽略了人们可以上传“.htaccess”文件的想法。 这在 .htaccess 文件中不起作用(出现错误 500)。应该添加到apache conf的vhost中。 我可以建议使用更短的正则表达式来涵盖所有 php1-php5 等和 phtml:"(?i)\.(ph.+)$" 如前所述,这不适用于 .htaccess 文件,需要放入 apache 的 vhost 配置中。对于第一个在 .htaccess 文件中工作的示例,只需使用:Order Deny,AllowDeny from All【参考方案3】:

如果您使用的是 mod_php,您可以将(在 /USERS 中的 .htaccess 或用于 USERS 目录的 httpd.conf 中)

RemoveHandler .php

RemoveType .php

(取决于 PHP 是使用 AddHandler 还是 AddType 启用的)

从另一个目录运行的 PHP 文件仍然能够在 /USERS 中包含文件(假设没有 open_basedir 限制),因为这不会通过 Apache。如果使用 apache 访问 php 文件,它将以纯文本形式提供服务。

编辑

Lance Rushing 拒绝访问文件的解决方案可能更好

【讨论】:

【参考方案4】:
<Directory /your/directorypath/>
     php_admin_value engine Off
</Directory>

【讨论】:

请考虑添加一些额外的 cmets。【参考方案5】:

这将显示源代码而不是执行它:

<VirtualHost *>
    ServerName sourcecode.testserver.me
    DocumentRoot /var/www/example
    AddType text/plain php
</VirtualHost>

我曾经用它来让其他同事能够从本地网络读取源代码(只是一个快速而肮脏的替代方案)。

警告!

正如 Dan 不久前指出的那样,这种方法永远不应该在生产中使用。请遵循接受的答案,因为它会阻止任何执行或显示 php 文件的尝试。

如果你希望用户共享 php 文件(并让其他人显示源代码),有更好的方法来做到这一点,比如 git、wiki 等。

应该避免这种方法! (您已被警告。出于教育目的将其留在这里)

【讨论】:

巨大的安全漏洞!不要在生产中做! @DanGarland 请告诉我们怎么做?\ @AbdulJabbarWebBestow 原因是任何人都可以查看源代码而不是执行它。如果这些代码包含敏感信息(如连接密码),则该信息可能被视为已泄露。 @DanGarland 我刚刚看到他提到的 text/plain 根文件夹的代码。你是绝对正确的。我可以看到 Lepe 已经编辑了他的答案并接受了你的观点。 那个“安全漏洞”是一个使用问题:将AddType text/plain php放在存储用户上传内容的目录中可能是一个有趣的安全保护:如果用户设法上传一个PHP文件,那么它不会被服务器执行,确保他们会看到 PHP 源代码,但是来自他们上传的文件【参考方案6】:

这些答案都不适合我(生成 500 错误或什么都不做)。这可能是因为我正在使用无法访问 Apache 配置的托管服务器。

但这对我有用:

RewriteRule ^.*\.php$ - [F,L]

此行将为任何以.php 结尾并在此子目录中结束的 URL 生成 403 Forbidden 错误。

@Oussama 引导我走向正确的方向here,感谢他。

【讨论】:

【参考方案7】:

这可能是矫枉过正 - 但要小心做任何依赖于 PHP 文件扩展名为 .php 的事情 - 如果有人稍后出现并为 .php4 甚至 .html 添加处理程序怎么办? php。您最好从其他 Apache 实例或其他仅提供静态内容的目录中提供文件。

【讨论】:

@Nevermind - 我不是在谈论你的用户。我说的是你,或者其他 2 年后的系统管理员。【参考方案8】:

在生产中,我更喜欢将请求重定向到应禁用 PHP 处理的目录下的 .php 文件到主页或 404 页面。这不会泄露任何源代码(为什么搜索引擎应该索引上传的恶意代码?)并且对访问者甚至对试图利用这些东西的邪恶黑客来说看起来更友好。 它也可以在大多数情况下实现 - vhost 或 .htaccess。 像这样的:

<DirectoryMatch "^$docroot/(image|cache|upload)/">
    <FilesMatch "\.php$">
        # use one of the redirections
        #RedirectMatch temp "(.*)" "http://$servername/404/"
        RedirectMatch temp "(.*)" "http://$servername"
    </FilesMatch>
</DirectoryMatch>

根据需要调整指令。

【讨论】:

【参考方案9】:

如果您使用php-fpm,php_admin_value 将工作并给出内部服务器错误。

改为在您的.htaccess 中使用它。它会禁用该文件夹和所有子文件夹中的解析器:

<FilesMatch ".+\.*$">
    SetHandler !
</FilesMatch>

【讨论】:

【参考方案10】:

我在 Centos 6.10 中用于虚拟主机 .conf 定义文件中的多个文件夹:

<DirectoryMatch ^/var/www/mysite/htdocs/(nophpexecutefolder1|nophpexecutefolder2)>
       php_admin_value engine Off
</DirectoryMatch>

然而,即使它不以通常的方式解析 php 代码,它仍然会从 .php 中输出诸如变量声明和文本等内容,例如执行 echo 时

<?php

echo "<strong>PHP CODE EXECUTED!!";

$a=1;
$b=2;

echo $a+$b;

以上在网络浏览器中产生?

PHP CODE EXECUTED!!"; $a=1; $b=2; echo $a+$b;

这可能会向用户公开一些不理想的代码。

因此,最好将上述内容与 .htaccess 中的以下内容结合使用:

<FilesMatch ".*.(php|php3|php4|php5|php6|php7|php8|phps|pl|py|pyc|pyo|jsp|asp|htm|html|shtml|phtml|sh|cgi)$">
 Order Deny,Allow
 Deny from all
  #IPs to allow access to the above extensions in current folder
  # Allow from XXX.XXX.XXX.XXX/32 XXX.XXX.XXX.XXX/32
</FilesMatch>

以上内容将阻止访问上述任何文件扩展名,但允许以通常方式访问其他扩展名,例如图像、css 等。访问.php时的错误:

Forbidden

You don't have permission to access /nophpexecutefolder1/somefile.php on this server.

【讨论】:

【参考方案11】:
<Files *.php>
    Order deny,Allow
    Deny from all
</Files>

【讨论】:

以上是关于使用 .htaccess 在目录(包括所有子目录)中禁用 PHP的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 拒绝访问目录中的所有 PHP 文件

如何使用 .htaccess 在除一个目录 /images 之外的所有 URL 上强制使用 HTTPS?

htaccess 文件、php、包括目录和 windows XAMPP 配置噩梦

使用 .htaccess 将所有子域和子目录重定向到索引页面

使用 htaccess 阻止特殊目录的所有 bots/crawlers/spider

.htaccess 拒绝所有-> 目录索引不起作用(拒绝所有和白名单文件)