当前位置:  开发笔记 > 编程语言 > 正文

如何防止我的服务器上的每个恶意文件上传?(检查文件类型)?

如何解决《如何防止我的服务器上的每个恶意文件上传?(检查文件类型)?》经验,为你挑选了3个好方法。

我的问题是避免用户在我的网络服务器上上传一些恶意文件.我正在研究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类型..基于扩展名-.-



1> palako..:

我不敢说你选择的答案是正确的.什么是文件命令的作用是读取文件在你的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文件..



2> RossFabrican..:

用户不应该能够执行他们上传的文件.删除他们的执行权限.



3> rmeador..:

您将需要验证上传的文件实际上是扩展程序指示的类型.你可以通过各种方法做到这一点,最简单的方法是通过file命令.我不知道它是否有API.你可以在shell中自己试试.对于你在上传之前重命名为file.jpg的file.exe的例子,运行file file.jpg它会打印出一些告诉你它是可执行文件的东西.然而,它可以被愚弄.

如果您认为.exe意味着它将被执行,我猜您对Linux文件权限知之甚少.在linux上,只有文件权限中的执行位才能确定 - 如果打开该位,您可以执行任何文件,无论扩展名如何.不要在任何上传的文件上设置它,你应该安全地执行它们.您可能仍然会将它们提供给您网站的访问者,因此它仍然可以成为XSS攻击的载体,因此请注意这一点.


虽然.EXE不会损害配置良好的服务器,但它们可能会被下载并损害某人的客户机.最好验证所有文件,甚至是那些不是直接威胁的文件.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有