阻止上传可执行映像(PHP)

Jam*_*son 2 php security upload image

我注意到用户一直试图通过头像图片上传来创建漏洞.当用户向我报告他们从Norton Anti-virus收到"HTTP可疑可执行图像下载"的通知时,就会发现这种情况.此警告引用了用户的头像图像.我不认为他们实际上在窃取信息或其他任何东西方面取得了任何成就,但我认为如果这个洞足够开放就可能.我使用PHP上传图像文件,然后检查上传的文件是png,jpg,bmp还是gif.

这是检查它是否是图像的代码:

$allow_types = array('image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/png', 'image/bmp', 'image/bitmap');
if (in_array($this->tmp_image['type'], 
$this->allow_types)) {
   return true;
}
Run Code Online (Sandbox Code Playgroud)

Tow*_*wer 7

无法阻止上传恶意文件.您需要关心的是如何处理这些文件.

重新保存图像文件等建议注定失败.可以通过对比特进行排序来绕过这种操作,使得它们在已知图像压缩器运行之后按照攻击者想要的顺序.

有很多方法可以将图像和恶意文件组合在一起.恶意文件可以是可执行文件,也可以只包含由浏览器解释的JavaScript.此外,您如何重新保存不是图像类型的文件?

处理文件上传时,必须注意以下事项.

  • 限制每个用户上传的字节数,这样您的服务器就不会耗尽空间.

  • 限制每个用户上传的文件数量,这样您的服务器就不会耗尽inode.

  • 将文件存储在文档根目录上,以便不能直接访问它们.

  • 通过PHP代理脚本提供文件,写如下:

    $data = file_get_contents('/home/account/files/file.png');
    header('Content-Type: image/png');
    header('Content-Length: '. strlen($data));
    header('X-Content-Type-Options: nosniff');
    echo $data;
    
    Run Code Online (Sandbox Code Playgroud)
  • 将上传的文件重命名为具有完全随机的名称,不带扩展名.如果需要存储文件名(和扩展名/类型),请将详细信息存储在数据库中.

  • 如果需要,仅在用户拥有文件时才提供文件.

  • 永远不要包含/执行您上传的文件.这意味着PHP中不包含或要求.没有包含它们的HTML脚本标记或样式表标记.没有Apache包含它们的命令.等等.

  • 如果可能的话,提供来自其他来源的文件.这消除了Flash主要出现的原始问题.使用不同的端口,域名或IP地址也没问题.从子域服务是危险的,并且使用IP地址实现变得稍微困难​​(即,您不能通过域提供文件,仅通过IP服务,您不能通过IP服务网站,而是通过域服务).

  • 谨防LFI和RFI.使用函数内的文件名等之前重命名的文件名fopen(),read()等,和验证/根据需要消毒的任何目录值.