我想知道当网站的最终用户可以将文件上传到服务器时会出现什么样的安全问题.
例如,如果我的网站允许用户上传个人资料图片,而一个用户上传了有害的内容,那么会发生什么?我应该设置什么样的安全措施来防止这样的攻击?我在这里谈论图像,但是用户可以将任何内容上传到文件库类应用程序的情况呢?
这是一个普遍的问题,而不是关于具体情况的问题,那么在这种情况下最好的做法是什么?你平常都做什么?
我想:上传时的类型验证,上传文件的不同权限 ......还有什么?
编辑:为了清理上下文,我正在考虑一个Web应用程序,用户可以上传任何类型的文件,然后在浏览器中显示它.该文件将存储在服务器上.用户是使用该网站的用户,因此不涉及任何信任.
我正在寻找可适用于不同语言/框架和生产环境的一般答案.
您的第一道防线是限制上传文件的大小,并终止任何大于该数量的转移.
文件扩展验证可能是一个很好的第二道防线.类型验证可以在以后完成...只要您不依赖于(用户提供的)mime类型进行所述验证.
为什么文件扩展验证?因为这是大多数Web服务器用来识别哪些文件是可执行的.如果您的可执行文件未被锁定到特定目录(并且很可能,它们不是),则具有特定扩展名的文件将在该站点的文档根目录下的任何位置执行.
文件扩展名检查最好使用您要接受的文件类型的白名单.
验证文件扩展名后,可以通过检查魔术字节或使用unix file命令检查以验证所述文件是否为其扩展声明的类型.
我确信还有其他一些我错过的问题,但希望这会有所帮助.
假设您只处理图像,您可以做的一件事是使用图像库生成缩略图/一致的图像大小,并在完成后将原始图像丢弃.然后,您实际上有一个点的漏洞:您的图像库.假设你保持最新,你应该没事.
用户将无法上传zip文件或任何非图像文件,因为如果图像库尝试调整非图像数据的大小,则会进行barf,并且您可以捕获异常.您可能希望对文件扩展名进行初步检查.如果文件名为"foo.zip",则无法通过图像库发送文件.
至于权限,那么......不要设置执行位.但实际上,权限无助于保护您免受恶意用户输入.
如果您的编程环境允许,您将需要在上载过程中运行其中一些检查.恶意HTTP客户端可能会发送无限大小的文件.IE,它永远不会停止传输随机字节,导致拒绝服务攻击.或者他们只是上传一个视频作为他们的个人资料图片.大多数图像文件格式在开头也有一个标题.如果客户端开始发送与任何已知图像标头不匹配的文件,则可以中止传输.但那已经开始进入矫枉过正的境界.除非你是Facebook,否则这种事情可能是不必要的.
编辑
如果您允许用户上传脚本和可执行文件,则应确保通过该表单上传的任何内容永远不会作为其他内容提供application/octet-stream
.Content-Type
当你处理有潜在危险的上传时,不要试图混合.如果您要告诉用户他们必须担心自己的安全性(这实际上是您接受脚本或可执行文件时所执行的操作),那么所有内容都应该被提供,application/octet-stream
以便浏览器不会尝试呈现它.您还应该设置Content-Disposition
标题.如果要处理可执行文件,将病毒扫描程序包含在管道中可能也是明智之举. 例如,ClamAV是可编写脚本的开源软件.