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

Posted

技术标签:

【中文标题】拒绝访问特定目录中的特定文件类型【英文标题】:Deny access to specific file types in specific directory 【发布时间】:2013-04-13 01:40:43 【问题描述】:

对于某些应用程序,用户可以上传自己的文件。由于这可能是非常大的文件,因此允许他们通过自己的 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 不可用,但其他所有内容都可用。我应该使用什么语法?

【问题讨论】:

【参考方案1】:

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

您可以将 .htaccess 放在 upload 目录中。然后,这些指令将仅适用于该目录和以下目录。详情请见How directives are applied。

因此,当位于public 目录中时,带有FilesMatch 的.htaccess 可以限制对匹配*.inc*.php 等的文件的访问

<FilesMatch "\.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>

【讨论】:

奥拉夫,谢谢您的回复。如果我还在上传中创建目录“文件”或其他内容,这可能是一个选项,因为否则用户可以删除 .htaccess。当没有其他选择时,我会这样做。有没有一种解决方案可以让我在根目录的 .htaccess 中写一些东西?如果可能的话,会更漂亮,更容易...... 感谢一位匿名用户,我修复了结束标签。不幸的是,编辑在我看到之前就被拒绝了。【参考方案3】:

您可以使用以下最简单且最简单的解决方案来拒绝对某些文件类型的访问:

RedirectMatch 403 ^/folder/.+\.(png|gif|js)$

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

【讨论】:

以上是关于拒绝访问特定目录中的特定文件类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 拒绝访问目录中的所有 PHP 文件

.htaccess 特定文件类型

git 忽略特定类型的所有文件,特定子文件夹中的文件除外

网页版批量提取目录下特定文件类型

使用批处理文件在目录下递归删除所有特定类型(扩展名)的文件

高分求解!!!如何让某个程序只拥有访问某个特定文件夹的权限