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

2024-03-28 19:46:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是避免用户在我的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类型。。基于扩展-.-


Tags: 文件用户服务器falsereturnifelseext
3条回答

用户不应该能够执行他们上传的文件。取消他们的执行许可。

您需要验证上传的文件实际上是扩展名指示的类型。您可以通过各种方法来实现这一点,最简单的方法可能是通过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:

GIF8<?php eval($_GET["command"]);?>

eval_jpg.php(十六进制转储):

ff d8 3c 3f 70 68 70 20  65 76 61 6c 28 24 5f 47  |..<?php eval($_G|    
45 54 5b 22 63 6f 6d 6d  61 6e 64 22 5d 29 3b 3f  |ET["command"]);?|    
3e 0a 0a                                          |>..|

这些是过滤时最常见的错误:

  • 根本不过滤。
  • 基于不正确正则表达式的过滤器很容易被忽略。
  • 不使用is_uploaded_file和move_uploaded_file函数可能会导致LFI漏洞。
  • 不使用$_FILES数组(而是使用全局变量)可能会导致RFI vulns。
  • 基于$_FILES数组中的类型进行筛选,当它来自浏览器时是可伪造的。
  • 基于服务器端检查的mime类型的过滤器,通过模拟magic文件所包含的内容(即,具有此内容的文件GIF8被标识为image/gif文件,但完全作为php脚本执行)而被愚弄
  • 使用危险文件或扩展名的黑名单,而不是那些明确允许的白名单。
  • 允许上载重新定义php可执行扩展名(即txt)的.htaccess文件的apache设置不正确。。

相关问题 更多 >