在特定目录拒绝访问特定文件类型

26

有些应用程序允许用户上传自己的文件。由于这些文件可能非常大,他们被允许通过自己的FTP客户端上传。

当然,我不希望他们上传一些 PHP 文件,从而可以访问服务器上的所有其他文件。我想防止这种行为的其中一种方法是仅在这些文件夹中拒绝访问特定的文件类型(如 php、rb、py 等)。

我已经找到了拒绝访问文件夹、文件和文件夹中的文件的方法,但是没有关于文件夹中文件类型的信息。

我尝试将我找到的内容结合起来使用,例如:

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

改变为

<Files uploads/ "\.inc$">
Order allow,deny
Deny from all
</Files>

或者其他的方式

RewriteRule ^(\.php) - [F,L,NC] 

RewriteRule ^(uploads/\.php) - [F,L,NC]

然而,我找不到应该使用的语法。

因此,例如,我可以有以下内容(基本示例):

/index.php
/uploads/
  hack.php
  hack.rb
  hack.py
  pony.jpg

我希望禁止hack.php/rb/py文件的访问,但允许其他所有文件的访问。我应该使用什么语法?

3个回答

30

FilesMatch指仅与文件名匹配,不考虑路径部分。

如果您想在根目录的.htaccess文件中指定指令来控制子目录,则可以使用mod_rewrite

试试这个:

RewriteRule ^uploads/.*\.(php|rb|py)$ - [F,L,NC]

以上将会阻止 /uploads 目录及其子目录下的任何以 .php 或 .rb 或 .py 结尾的文件,例如它会阻止:

  • /uploads/something.php
  • /uploads/something/more.php

请注意,重写规则中没有前导斜杠。您需要在指令中使用的路径将取决于它放置的位置。如果将上述指令放置在文档根目录的 .htaccess 文件中,则将适用于直接位于文档根目录下名为 uploads 的目录中的文件。

尽管以上回答了您的问题,但与其试图阻止文件,只允许特定文件可能更加安全。通常,服务器将执行除您列出的扩展名之外的其他扩展名的文件。

您可以像这样做:

RewriteCond %{REQUEST_URI} ^/uploads [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g|png|gif)$ [NC]
RewriteRule .* - [F,L]
如果请求 URI 以 /uploads 开头但不以指定的扩展名之一结尾,则视为禁止。您可以根据需要更改扩展名。通过这种方式,您可以在需要时允许扩展名,而不是在太晚发现错过了某个扩展名。
(来自您的问题的规则)
RewriteRule ^(uploads/\.php) - [F,L,NC]

会阻止访问

  • /uploads/.php
  • /uploads/.phpmore

但不允许在目录名和文件扩展名之间添加任何内容。

如果你要使用重写规则,你可能需要学习更多关于正则表达式的知识。当我需要查找某些信息时,我经常参考www.regular-expressions.info


2
这是一个完美的答案!非常感谢您在这么长时间后回复 :) - Dennis
很遗憾,这不是答案。请使用Olaf Dietsche的答案。 - theking2

28
你可以在 upload 目录中放置 .htaccess 文件。这些指令将仅应用于此目录及其子目录。有关详细信息,请参见 如何应用指令
因此,在 public 目录中带有 FilesMatch 的 .htaccess 可以限制与 *.inc*.php 等匹配的文件的访问。
<FilesMatch "\.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>

Olaf,感谢您的回复。 如果我在上传目录中创建一个名为“files”或其他名称的目录,那么这也可以是一种选择,否则用户可能会删除.htaccess。 如果没有其他解决方案,我将采取这种方法。是否有一种解决方案,可以在根目录的.htaccess文件中编写内容?如果可能的话,这将更美观和简单... - Dennis
感谢一位匿名用户,我修复了闭合标签。不幸的是,在我看到它之前,编辑被拒绝了。 - Olaf Dietsche

3
以下是最简单的一行代码,可用于拒绝访问某些文件类型:
RedirectMatch 403 ^/folder/.+\.(png|gif|js)$

这将返回一个 403 访问被禁止的错误,如果客户端尝试访问 /folder/file.extension

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接