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

时间:2013-04-19 15:41:40

标签: file .htaccess directory file-type

对于某些应用程序,用户可以上传自己的文件。由于这可能是非常大的文件,因此允许他们通过自己的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 个答案:

答案 0 :(得分:21)

您可以将.htaccess放在upload目录中。然后,这些指令将仅适用于此目录和下面的目录。有关详细信息,请参阅How directives are applied

因此,当*.inc目录

时,带有FilesMatch的.htaccess可以限制对*.phppublic等文件的访问权限
<FilesMatch "\.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>

答案 1 :(得分:18)

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

但它不允许目录名和文件扩展名之间的任何内容。

如果您打算使用reirte规则,您可能想要了解有关regexp的更多信息。当我需要查找某些内容时,我经常会提到www.regular-expressions.info

答案 2 :(得分:0)

您可以使用以下最简单和一个线性解决方案来拒绝访问certen文件类型:

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

如果客户端尝试访问 /folder/file.extension ,则会返回403 Access forbidden错误。