我的问题是避免用户在我的网络服务器上上传一些恶意文件.我正在研究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或whatelse中,unix系统可以轻松运行,以检查文件的真正类型吗?
我已经尝试了python mimetypes模块,但它检索文件的ipotetical mime类型..基于扩展名-.-
我不敢说你选择的答案是正确的.什么是文件命令的作用是读取文件在你的Linux系统,在/ usr /共享/文件/魔术,其中有文件的签名.例如,GIF图像以文本GIF8开头,或者JPEG文件以字节0xffd8开头.您只需要在上传的文件中使用这些签名来欺骗文件命令.这两个文件将被接受为图像,即使它们将作为PHP代码运行:
eval_gif.php:
GIF8
eval_jpg.php(hexdump都):
ff d8 3c 3f 70 68 70 20 65 76 61 6c 28 24 5f 47 |....|
这些是过滤时最常见的错误:
根本不过滤.
基于不正确的正则表达式过滤容易绕过.
不使用is_uploaded_file和move_uploaded_file函数可以获得LFI漏洞.
不使用$ _FILES数组(使用全局变量)可以使用RFI漏洞.
根据$ _FILES数组中的类型进行过滤,因为它来自浏览器.
基于服务器端检查的mime-type进行过滤,通过模拟魔术文件包含的内容来欺骗(即具有此内容的文件GIF8被识别为图像/ gif文件但完美地作为php脚本执行)
使用危险文件或扩展名列入黑名单,而不是明确允许的那些列入白名单.
不正确的apache设置,允许上传重新定义php可执行扩展(即txt)的.htaccess文件..
用户不应该能够执行他们上传的文件.删除他们的执行权限.
您将需要验证上传的文件实际上是扩展程序指示的类型.你可以通过各种方法做到这一点,最简单的方法是通过file
命令.我不知道它是否有API.你可以在shell中自己试试.对于你在上传之前重命名为file.jpg的file.exe的例子,运行file file.jpg
它会打印出一些告诉你它是可执行文件的东西.然而,它可以被愚弄.
如果您认为.exe意味着它将被执行,我猜您对Linux文件权限知之甚少.在linux上,只有文件权限中的执行位才能确定 - 如果打开该位,您可以执行任何文件,无论扩展名如何.不要在任何上传的文件上设置它,你应该安全地执行它们.您可能仍然会将它们提供给您网站的访问者,因此它仍然可以成为XSS攻击的载体,因此请注意这一点.