我想找出从我服务器上的一个特定子文件夹中禁止任何可执行文件的最有效方法。我允许用户将文件上传到该文件夹,并希望从Web访问该文件夹。我有几乎用mod_rewrite锁定的根文件夹。在那个没有保护的子文件夹中,我有.htaccess:
Options +Indexes IndexOptions +FancyIndexing +FoldersFirst +HTMLTable RewriteEngine off
我知道最好只限制文件上传到某些允许的文件类型,我已经在php中这样做了。我正在检查文件扩展名和mime类型,然后允许像这样上传:
$allmime=array('image/gif', 'image/png', 'image/jpeg', 'application/msword', 'application/pdf');
$allext=array('png', 'jpg', 'gif', 'doc', 'pdf');
$path=pathinfo($_FILES['file']['name']);
$mime=trim(shell_exec("file -bi " . $_FILES['file']['tmp_name']));
if( !in_array( $path['extension'], $allext) || !in_array($mime, $allmime) ){
//ban
}else{
//allow
}
但是我不确定是否存在一些令人费解的黑客攻击仍然允许在服务器上上传和执行shell脚本,因为所有成功上传的文件都会立即可见。
我知道.htaccess中有另一个选项可以过滤掉这样的文件:
<FilesMatch "\.(sh|asp|cgi|php|php3|ph3|php4|ph4|php5|ph5|phtm|phtml)$">
order allow, deny
deny from all
</FilesMatch>
但是我不确定这个列表是否包罗万象,而且这很难维护,因为将来可能会安装新的扩展。
总结一下:任何人都知道禁止所有服务器可执行文件的好方法,但%{HTTP_HOST}
直接执行的php脚本除外?
答案 0 :(得分:2)
您可以做几件事来绝对锁定某些文件夹,以确保PHP无法在其中执行,特别是在执行PHP上传脚本并且您不希望世界能够执行任意代码时非常有用在您的服务器上利用您的上传代码:
php_flag engine off
&#13;
ForceType application/octet-stream
Header set Content-Disposition attachment
<FilesMatch "(?i)\.(gif|jpe?g|png)$">
ForceType none
Header unset Content-Disposition
</FilesMatch>
&#13;
答案 1 :(得分:0)
最好的方式(imo)就是关闭子文件夹中的x(linux中的可执行权限)。所以我会将权限更改为644(登录后你可以读写,但世界只能阅读)。这可以在cpanel中完成。确保也将其应用于子文件夹。
答案 2 :(得分:0)
通过上传的文件名过滤恶意用户将如何将不良内容送到您的服务器上。 $ _FILES名称和类型属性是用户提供的数据,没有任何说明用户无法上传PHP脚本但称之为'puppies.jpg'
过滤的正确方法是使用类似Fileinfo的东西并检查实际的MIME类型并过滤
答案 3 :(得分:0)
如何禁用该特定目录的服务器端处理程序?类似的东西:
<Directory /path/to/restrict>
SetHandler None
Options None
AllowOverride None
</Directory>
这是未经测试的,但似乎可能有效。
更新:显然,我错了......但在AddHandler default-handler
中坚持.htaccess
似乎有效。
答案 4 :(得分:0)
拒绝完全访问.htaccess文件中的文件夹,然后使用下载脚本下载文件,会省去很多麻烦。
答案 5 :(得分:0)
来自twitter的bootstrapper .htaccess,这对我有用(只是添加了exe):
# Block access to backup and source files.
# These files may be left by some text editors and can pose a great security
# danger when anyone has access to them.
<FilesMatch "(^#.*#|\.(exe|bak|config|dist|fla|inc|ini|log|psd|sh|sql|sw[op])|~)$">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
结果:
<强>禁止强>
您无权访问此服务器上的/test/test.exe。
答案 6 :(得分:0)
看here
以下规则将禁止从您的服务器下载 .exe(我添加了 .bat)文件:
<Directory "/my/files">
Require all granted
RewriteEngine on
RewriteRule "(\.exe|\.bat)" "-" [F]
</Directory>