我有一个带有上传控件的 ASP.NET 表单,供用户发布图像。在服务器上,我加载该图像(使用 Bitmap 类)并调整它的大小。
当用户上传恶意或受影响的文件时这样做是否有任何危险,或者代码会在某个时候抛出异常并停止整个过程?
我有一个带有上传控件的 ASP.NET 表单,供用户发布图像。在服务器上,我加载该图像(使用 Bitmap 类)并调整它的大小。
当用户上传恶意或受影响的文件时这样做是否有任何危险,或者代码会在某个时候抛出异常并停止整个过程?
最好的黑客可以指望使用缓冲区溢出漏洞,然后他将恶意代码写入服务器内存。但是根据我的阅读,只有在使用不安全的代码时才会发生这种情况,并且由于位图是完全托管的,我很确定使用它是安全的。
然而,真正聪明的黑客可以欺骗位图并创建“自定义”图片文件,该文件将是完全有效的图片,但也会包含在浏览器中查看时可能会造成损坏的“搭便车”代码,使用一些未来的漏洞。所以最安全的方法是将 Bitmap 本身保存到磁盘而不是原始上传文件,这意味着使用 bitmap.Save 方法而不是 HttpPostedFile 的 SaveAs 方法。这样,任何额外的代码都将被省略,因为位图不会加载它并且您的访问者将是安全的。
顺便说一句,您可以将上传的文件存储在网站根文件夹之外,并创建“代理”文件以从文件夹中读取它:这样用户将无法直接浏览到图像,他们将不得不使用代理文件。如果您在某个时候添加权限机制,这很有用,例如用户 A 不应该看到用户 B 上传的内容。
我会:
确保上传的文件绝对是一个图像,这样人们就不能上传任意的东西——但你可能已经用他的 Bitmap 类覆盖了。
上传后重命名文件,以便上传的人不知道他们创建的文件名。
确保上传目录具有最小权限。
确保无法在浏览器中查看上传目录的内容。