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


68

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

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

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

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

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

Answers:


118

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

php_flag engine off

8
@Lance Rushing:文件的内容将发送到客户端。但是,为什么不自己尝试一下会发生什么呢?
Gumbo

20
请注意,如果未将PHP作为mod_php安装,则会出现500错误。敷在<IfModule mod_php5.c>... </IfModule>
HalilÖzgür11年

4
可以使用php_admin_flag,不能在.htaccess文件中使用。.htaccess或ini_set()不能覆盖任何用php_admin_value设置的指令类型。要清除先前设置的值,请​​使用none作为该值。
pylover 2014年

7
但是,有人可以创建一个子目录并在新的.htaccess中放置一个“ php_flag引擎”,然后从该子目录运行PHP代码吗?
user5858 2014年

1
@ user5858是的,那是可能的。
Gumbo 2014年

50

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

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

1
“不要允许人们在htaccess中覆盖”,是的,这是一个很好的选择。如果人们可以简单地用本地htaccess文件覆盖它,那么htaccess中的所有工作都将被浪费。您的演示环境可能没有使用php文件,因此最好不要完全创建或提供它们(甚至不提供源代码视图),而完全阻止它们(包括htaccess文件)
Timo Tijhof 2012年

出色的评论,我忽略了人们可以上传“ .htaccess”文件的想法。
巴特2014年

1
.htaccess文件中不起作用(错误500)。应该将其添加到apache conf的虚拟主机中。
NicolasBernier 2014年

我是否可以建议使用更短的正则表达式来涵盖所有php1-php5等和phtml:"(?i)\.(ph.+)$"
Aleksey Napolskih

如前所述,这不适用于.htaccess文件,需要将其放入apache的vhost配置中。对于第一个在.htaccess文件中工作的示例,只需使用: Order Deny,Allow Deny from All
Pierre-Olivier Benoit

13

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

RemoveHandler .php

要么

RemoveType .php

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

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

编辑

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



10

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

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

我曾经使用它一次,以使其他同事能够从本地网络读取对源代码的访问权限(只是一种快速而肮脏的选择)。

警告 !

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

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

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


1
巨大的安全漏洞!不要在生产中做!
丹·加兰

@DanGarland请告诉我们如何?\
艾里(Airy)

@AbdulJabbarWebBestow原因是因为任何人都可以查看源代码而不是执行它。如果这些代码包含敏感信息(例如连接密码),则可以认为该信息已被泄露。
lepe

@DanGarland我刚刚看到了他提到过text / plain根文件夹的代码。你是绝对正确的。我可以看到Lepe编辑了他的答案并接受了您的观点。
艾里(Airy)

1
这个“安全漏洞”是一个使用问题:将AddType text/plain php用户上传的内容存储在目录中可能是一个有趣的安全防护措施:如果用户设法上传一个PHP文件,那么它将不会由服务器执行,确定他们会看到PHP源代码,但是他们从文件中上传了文件
-Xenos

5

这些答案对我都不起作用(产生500错误或不执行任何操作)。这可能是由于我在无法访问Apache配置的托管服务器上工作。

但这对我有用:

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

对于任何.php以该子目录结尾并以其结尾的URL,此行将生成“ 403禁止错误” 。

@Oussama使我朝着正确的方向在这里,感谢他。


1

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


5
@Nevermind-我不是在谈论您的用户。我说的是您或其他两年后的其他系统管理员。
Dominic Rodger

1

在生产环境中,我更喜欢将请求重定向到应该禁用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>

根据需要调整指令。


1

如果使用php-fpm,则php_admin_value不会工作,给内部服务器错误。

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

<FilesMatch ".+\.*$">
    SetHandler !
</FilesMatch>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.