假设您可以将任何您希望的文件上传到服务器,但文件扩展名必须为“.jpg”。你能上传任何可能损害服务器的东西吗?
我的问题是文件类型验证很慢,我宁愿只检查文件扩展名是否足够安全。我无法想象可以使用伪装成图像的恶意软件的情况。
我已经看到了使用getimagesize()来验证图像的建议,但是这个功能非常慢,而且我无法弄清楚是否有必要甚至有效防止恶意软件上传......
非常感谢有关此事的任何信息。
答案 0 :(得分:4)
为了测试图像的安全性,我实际上只使用一种方法:只需使用GD或您正在使用的任何图像处理库重新创建图像,然后使用新图像。
如果你有更新版本的库,这应该使文件完全安全。
它可能会使你的东西变慢,但越安全越好。
只检查文件名末尾是否有'.jpg'就行无效了。该文件仍然可以是任何类型的文件。
希望这有帮助!
答案 1 :(得分:4)
似乎只检查扩展名是不安全的。对服务器有害吗?很难说,不知道服务器操作系统,上传文件的权限等。你绝对不希望允许这些执行。 通过允许用户上传非图像,它肯定很容易被滥用,然后他们只是重命名为他们的朋友下载它时的真实情况。这就是你如何发现自己不知不觉地托管盗版电影,warez等。
答案 2 :(得分:3)
如果您认为getimagesize()
有点太慢(因为所有上传都是以超高速完成的,我们知道;))您也可以尝试fileinfo
library。它至少检查文件中的一些字节。这是非常快的,我每天都会在应用程序中使用它来运行数百个应该快速运行的文件。
然而,你不知道你不知道的是什么。因此,可能首先检查扩展名,确保安全文件名和安全存储,并将它们正确发送给客户端。
在让任何图像库触摸它之前(这应该包括您网站用户的计算机上的图像库),出于安全原因,应该由病毒扫描程序扫描该文件。与getimagesize()
相比,这要慢得多,其他人则建议查看文件中是否存在<?php
,以防止上传为有效负载。当然,这包括检查phar
文件,如果没有通过PHP安装安全设置阻止包含(例如通过suhosin)
在按需病毒扫描旁边,由于以前未知的漏洞利用,应不时地一次又一次地检查存储的文件。
因此,部分原因始终是后台工作。但即使是随需应变的实时检查通常也不需要花费那么多时间,除非您的应用程序确实上传了所有时间。您可能想要引入一些上传队列,因此上传已经完成,但在运行必要的任务后文件可供上传者使用。
答案 3 :(得分:0)
不检查图像是否是图像的另一个副作用是,何时,如果需要在网站上的某个位置(在用户配置文件中,在首页上等)显示它,那么如果它不是真正的图像,它会显得破碎,因此,您的网站会出现故障。
对于注入的恶意软件,这取决于您的服务器配置。如果它尚未更新以确保漏洞和攻击,那么恶意软件可以渗透(尽管这很少见,但可能)。