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

63 php apache .htaccess

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

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

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

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

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

Gum*_*mbo 115

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

php_flag engine off
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果未将PHP安装为mod_php,则会出现500错误.将它包装在`<IfModule mod_php5.c>```</ IfModule>`中. (20认同)
  • @Lance Rushing:文件的内容将发送给客户端.但是你为什么不亲自尝试看看会发生什么? (8认同)
  • 但有人可以创建一个子目录并在新的.htaccess中放置一个"php_flag引擎"然后从这个子目录运行PHP代码吗? (7认同)
  • 可以使用`php_admin_flag`,这不能用于.htaccess文件.使用php_admin_value设置的任何指令类型都不能被.htaccess或ini_set()覆盖.要清除先前设置的值,请​​使用none作为值. (3认同)
  • 我根本不建议使用它。正如一些人指出的那样,这允许人们下载您的 PHP 文件的内容。在我看来,这是非常不安全的,永远不应该这样做。 (2认同)

Lan*_*ing 48

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

<Directory full-path-to/USERS>
     Order Deny,Allow
     Deny from All
 </Directory>
Run Code Online (Sandbox Code Playgroud)

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

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

# Example of existing recognized extenstions:
AddType application/x-httpd-php .php .phtml .php3
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • “不允许人们在 htaccess 中覆盖”,是的,这是一个非常好的方法。如果人们可以简单地使用本地 htaccess 文件覆盖它,那么 htaccess 中的所有工作都将被浪费。您的演示环境可能对 php 文件没有用处,因此您最好根本不允许创建或提供它们(甚至不允许查看源代码),只需完全阻止它们(包括 htaccess 文件) (2认同)

Tom*_*igh 13

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

RemoveHandler .php
Run Code Online (Sandbox Code Playgroud)

要么

RemoveType .php
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

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

  • 我使用mod_php,但这不起作用,抱歉. (3认同)

lep*_*epe 10

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

<VirtualHost *>
    ServerName sourcecode.testserver.me
    DocumentRoot /var/www/example
    AddType text/plain php
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我使用它一次,以使其他同事能够从本地网络读取源代码(只是一个快速而又脏的替代方案).

警告 !:

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

如果你想让用户共享php文件(并让其他人显示源代码),有更好的方法来做,比如git,wiki等.

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

  • 巨大的安全漏洞!不要在生产中做! (2认同)
  • 这个“安全漏洞”是一个使用问题:将 `AddType text/plain php` 放在存储用户上传内容的目录中可能是一个有趣的安全防护:如果用户设法上传 PHP 文件,那么它就不会'不是由服务器执行,他们肯定会看到 PHP 源代码,但是来自他们上传的文件 (2认同)

小智 10

<Directory /your/directorypath/>
     php_admin_value engine Off
</Directory>
Run Code Online (Sandbox Code Playgroud)

  • 它只是有效.这都是评论 (8认同)
  • 请考虑添加一些其他评论. (7认同)

Fab*_*aux 9

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

但这对我有用:

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

对于.php以该子目录结尾并以该子目录结尾的任何 URL,该行将生成 403 Forbidden 错误。

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