我的问题是避免用户在我的web服务器上上传恶意文件。 我在linux环境(debian)上工作。
实际上,上传是通过以下代码通过php处理的:
function checkFile($nomeFile, $myExt = false){
if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; }
$punto = strrpos($nomeFile, '.');
$ext = "_".substr($nomeFile, $punto, 8)."_";
if(stristr($goodExt, $ext)){ return 1; }else{ return 0; }
}
在这里我可以指定允许上传的扩展名,如果文件不符合要求,我会在上传完成后立即删除。 但这样,用户就可以通过简单的重命名来更改文件扩展名。。这对我不好;即使file.exe(例如)如果在file.jpg中重命名就永远不会执行(我说得对吗?),我不想在我的服务器上有潜在的危险文件。
有一种方法,在php、python中,或者unix系统可以轻松地运行什么,来检查文件的真正类型?
我尝试过python mimetypes模块,但它检索了文件的ipotetic mime类型。。基于扩展-.-
用户不应该能够执行他们上传的文件。取消他们的执行许可。
您需要验证上传的文件实际上是扩展名指示的类型。您可以通过各种方法来实现这一点,最简单的方法可能是通过
file
命令。我不知道它是否有API。你可以自己试试。对于上载前重命名为file.jpg的file.exe示例,运行file file.jpg
,它将打印出一些内容,告诉您它是一个可执行文件。不过,这是可以被愚弄的。如果你认为.exe意味着它将被执行,那么我猜你对Linux文件权限知之甚少。在linux上,只有文件权限中的execute位决定了——如果该位处于启用状态,则可以执行任何文件,而不管其扩展名如何。不要在任何上传的文件上设置它,你应该可以安全地执行它们。你可能仍然在为他们服务,让他们回到你网站的访问者那里,所以它仍然可能是XSS攻击的一个载体,所以要小心。
我不敢说你所选的正确答案是不正确的。file命令所做的是在linux系统中读取一个文件,即具有文件签名的/usr/share/file/magic。例如,GIF图像以文本GIF8开头,或者JPEG文件以字节0xffd8开头。您只需要在上传的文件中包含这些签名,就可以欺骗文件命令。这两个文件将被接受为图像,即使它们将作为php代码运行:
评估gif.php:
eval_jpg.php(十六进制转储):
这些是过滤时最常见的错误:
相关问题 更多 >
编程相关推荐