对于某些应用程序,用户可以上传自己的文件。由于这可能是非常大的文件,因此允许他们通过自己的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不可用,但其他一切都可用。我应该使用什么语法?
答案 0 :(得分:21)
您可以将.htaccess放在upload
目录中。然后,这些指令将仅适用于此目录和下面的目录。有关详细信息,请参阅How directives are applied。
因此,当*.inc
目录
FilesMatch
的.htaccess可以限制对*.php
,public
等文件的访问权限
<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结尾的任何文件名。例如,它将阻止:
请注意,重写规则中没有前导斜杠。您需要在指令中使用的路径将根据其放置位置而有所不同。上述指令(如果放在文档根目录的.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]
会阻止
但它不允许目录名和文件扩展名之间的任何内容。
如果您打算使用reirte规则,您可能想要了解有关regexp的更多信息。当我需要查找某些内容时,我经常会提到www.regular-expressions.info。
答案 2 :(得分:0)
您可以使用以下最简单和一个线性解决方案来拒绝访问certen文件类型:
RedirectMatch 403 ^/folder/.+\.(png|gif|js)$
如果客户端尝试访问 /folder/file.extension ,则会返回403 Access forbidden错误。