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

时间:2009-08-13 13:20:11

标签: php apache .htaccess

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

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

现在我要禁用PHP,但在/ USERS

内的direcories和子目录中启用服务器端包含

可以这样做(以及如何:))?提前谢谢。

BTW,我使用WAMP服务器

11 个答案:

答案 0 :(得分:114)

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

php_flag engine off

答案 1 :(得分:47)

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

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

答案 2 :(得分:13)

如果你正在使用mod_php,你可以把(在USERS目录中的.htaccess或USERS目录的httpd.conf中)。

RemoveHandler .php

RemoveType .php

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

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

修改

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

答案 3 :(得分:10)

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

答案 4 :(得分:9)

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

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

我曾经使用过一次,让其他同事可以从本地网络读取源代码(只是一个快速而又脏的选择)。

警告!

Dan不久前指出,这种方法绝对不能用于生产。请遵循接受的答案,因为它会阻止任何执行或显示php文件的尝试。

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

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

答案 5 :(得分:2)

这些答案都不适用于我(产生500错误或无所事事)。这可能是因为我在托管服务器上工作,我无法访问Apache配置。

但这对我有用:

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

此行会为以.php结尾的任何网址生成403 Forbidden错误,最终会出现在此子目录中。

@Oussama让我走向正确的方向here,谢谢他。

答案 6 :(得分:1)

这可能有些过分 - 但要小心做任何依赖于.php扩展PHP文件的事情 - 如果有人稍后出现并为.php4甚至.html添加处理程序会怎么样?所以他们是由PHP处理的。您可能最好从Apache的不同实例或其他服务器提供这些目录中的文件,这些实例仅提供静态内容。

答案 7 :(得分:1)

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

请在您的.htaccess中使用它。它将禁用该文件夹及其所有子文件夹中的解析器:

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

答案 8 :(得分:0)

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

using String = std::basic_string<TCHAR>;

// a struct with all the properties you'd like to use on disconnect
struct device_info {
    CHANGER_PRODUCT_DATA cpd; // just an example
    String something;
};

int main() {
    // a map where the device_name is the key and device_info the value
    std::unordered_map<String, device_info> devices;

    {   // on connect, create a device_info struct and fill it with the info you need on
        // disconnect
        DEV_BROADCAST_DEVICEINTERFACE* devInterface =
            reinterpret_cast<DEV_BROADCAST_DEVICEINTERFACE*>(lParam);
        String new_dev_name { devInterface->dbcc_name };

        device_info di{}; // store what you need from the opened device here
                          // and put it in the map
        devices.emplace(new_dev_name, di);
    }

    {   // on disconnect, find the entry in the map using the disconnected device_name
        DEV_BROADCAST_DEVICEINTERFACE* devInterface =
            reinterpret_cast<DEV_BROADCAST_DEVICEINTERFACE*>(lParam);
        String disc_dev_name{ devInterface->dbcc_name };

        auto fit = devices.find(disc_dev_name);

        if (fit != devices.end()) {
            // we found the device, extract it
            device_info disc_di = fit->second;
            // and erase it from the map
            devices.erase(fit);
            std::wcout << "\"" << disc_di.something << "\" disconnected\n";
        }
    }
}

根据需要调整指令。

答案 9 :(得分:0)

我在 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.

答案 10 :(得分:-3)

试试这个:

    <FilesMatch "\.((php[0-9]?)|p?html?|pl|sh|java|cpp|c|h|js|rc)$">
    SetHandler None
    </FilesMatch>