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

我正在做一个网站,允许人们上传文件,html 页面等。.现在我有麻烦了。我有一个这样的目录结构:

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

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

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

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

141412 次浏览

如果使用 mod _ php,可以将(任意一个)放入。在/USERS 目录中或在您的 httpd.conf 中访问 USERS)

RemoveHandler .php

或者

RemoveType .php

(取决于 PHP 是否使用 AddHandler 或 AddType 启用)

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

剪辑

兰斯 · 拉什拒绝访问文件的解决方案可能更好

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

<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>

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

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

这可能有点夸张-但是做任何依赖于 PHP 文件的扩展名为 .php的事情都要小心-如果后来有人添加了 .php4甚至 .html的处理程序,这样它们就可以由 PHP 处理了。您最好从这些目录中提供来自 Apache 或其他实例的文件,这些实例只提供静态内容。

尝试禁用.htaccess 文件中的 engine选项:

php_flag engine off

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

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

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

警告:

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

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

这种方法应该避免! (你已经被警告过了。把它留在这里是为了教育的目的)

<Directory /your/directorypath/>
php_admin_value engine Off
</Directory>

这些答案对我来说都不起作用(要么产生500个错误,要么什么都不做)。这可能是因为我在一个托管服务器上工作,无法访问 Apache 配置。

但这对我有用:

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

此行将为以 .php结尾并最终位于此子目录中的任何 URL 生成一个403禁止错误。

多亏了他,让我找到了正确的方向。

在生产中,我倾向于将请求重定向到。在 PHP 处理应该禁用到主页或404页的目录下的 PHP 文件。这不会显示任何源代码(为什么搜索引擎应该索引上传的恶意代码?)而且对于访问者,甚至是试图利用这些东西的邪恶黑客来说,看起来更加友好。 它也可以在大多数情况下在任何上下文中实现—— 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>

根据需要调整指令。

如果您使用 php-fpm,php _ admin _ value 将 没有工作并给出一个内部服务器错误。

它禁用该文件夹和所有子文件夹中的解析器:

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

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

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

但是,即使它不像通常那样解析 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 等被访问的通常方式。访问时的错误。译者:

Forbidden


You don't have permission to access /nophpexecutefolder1/somefile.php on this server.
<Files *.php>
Order deny,Allow
Deny from all
</Files>