2012-03-03 71 views
0

我读this artcile上的文件上传安全,但现在看来,我上传的有效PDF被授予访问禁止后实施这个htaccess顶部提到的其他安全方法:文件安全使用htaccess阻止普通的pdf文件

deny from all 
<Files ~ "^\w+\.(gif|jpe?g|png|pdf|doc|docx|txt|rtf|ppt|pptx|xls|mp4|mov|mp3|mpg|mpeg)$"> 
order deny,allow 
allow from all 
</Files> 

文件名看起来是这样的: 公司APV-A4-Solarpanels_ABC-RH.pdf

因为htaccess的是为了防止双倍扩展攻击,如果我理解正确的话应该是罚款。希望有人能帮助!

+1

_doubled extension attack_(这只是Microsoft Windows用户使用_Hide已知文件类型选项_ON_时出现的一个问题,它是一个选项,我总是关闭_OFF_)意味着一个名为OpenMe.pdf.exe的文件作为“OpenMe.pdf”)或类似的正则表达式不匹配的用户。 - 为什么要保护Windows用户不受Microsoft创建的问题的困扰? – 2012-03-03 09:28:27

+0

我认为这篇文章解释得很好,该MIME类型可以被欺骗,这也适用于Apache,这意味着PHP脚本可能被嵌入到图像中,例如... – scott 2012-03-04 10:32:12

回答

0

为什么不:

SetEnvIf Request_URI "(^|/)[-\w]+\.(gif|jpe?g|png|pdf|doc|docx|txt|rtf|ppt|pptx|xls|mp4|mov|mp3|mpg|mpeg)$" allowed 

<Files *> 
    Order deny,allow 
    Deny from all 
    Allow from env=allowed 
</Files> 

另外请注意,我放弃了强制性领先^因为你一定要允许访问这些扩展的子目录和[-\w]+-\w

我只是开始我的正则表达式\.(gif ...因为你真的只需要检查你想要的扩展名。由你决定。

+0

嗨特里,感谢您的答复。看起来不错,但在我执行之前,我想了解更好一点,对我来说有点复杂......如果我从这里明白了理由http://httpd.apache.org/docs/2.0/mod/mod_setenvif.html setenvif会检查文件的http标题是否有效。我认为这就是我原来的剧本所做的。原始脚本似乎也能在子目录中正常工作 – scott 2012-03-04 10:35:33

+0

有两个方面(i)您绝对不会将'ABC-RH.pdf'与'\ w + \。pdf'匹配。 '\ w' meta不包含“'”“。你需要'[ - \ w] *'在这里,或者放弃它(如果一个文件包含'%20'?)。(ii)** SetEnvIf ** vs ** FilesMatch ** vs **文件〜**:这是一个比性能优先考虑的问题。我喜欢我的模式,因为它的意图非常清晰。 – TerryE 2012-03-04 11:08:30

1

我刚刚在研究别的解决方案时遇到了这个问题。但是,要做出一个更简单的解决方案,因为你基本上要防止所有双扩展,你应该这样做:

Order Allow,Deny 
<FilesMatch "^[^.]+\.(gif|jpe?g|png|pdf|doc|docx|txt|rtf|ppt|pptx|xls|mp4|mov|mp3|mpg|mpeg)$"> 
Allow from all 
</FilesMatch> 

更重要的一点,更简单。使用FilesMatch(因为FilesMatch更好地利用了REGEX并且多于Files),它使用'Order Allow, Deny'指令,这意味着匹配允许或拒绝,如果不匹配,则拒绝。所以这否认除了允许的东西以外的所有东西。

[^.]意味着任何字符'不'字面期间。这几乎涵盖了你想要实现的一切。请记住,这些规则不允许使用大写的文件扩展名。有些人使用创建大写文件扩展名的旧应用程序,因此您可能也希望包含这些扩展名。

我不知道的“/i”不区分大小写有多好作品与FilesFilesMatch所以你可能想要做的字符类是这样的:

([Jj][Pp][Ee]?[Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Pp][Dd][Ff]) 

等。