Django阻止上传包含可能的XSS代码的图像



我正在创建一个用户可以上传图像的网站。我使用django-storages将这些图像转发到S3 bucket,但我最近阅读了Django网站上的安全文档:https://docs.djangoproject.com/en/3.0/topics/security/#user-上传内容

Django的媒体上传处理在以不遵循安全最佳实践的方式提供媒体时会造成一些漏洞。具体来说,如果HTML文件包含一个有效的PNG标头,后面跟着恶意的HTML,则该文件可以作为图像上传。该文件将通过Django用于ImageField图像处理(Pillow(的库的验证。当此文件随后显示给用户时,根据web服务器的类型和配置,它可能会显示为HTML。

它告诉了我有关此漏洞的信息,但它并没有为我提供针对这些漏洞的有效保护方法。这是网站中最易受攻击的前三名。

考虑从云服务或CDN提供静态文件以避免其中一些问题。

我使用S3来提供我的媒体文件,它确实说要避免本节中描述的一些漏洞,但没有说哪个

我的问题是:向AWS S3上传和提供图像是否容易受到这些攻击,如果没有对图像内容进行消毒的有效方法是什么?

赏金编辑:我在S3上托管图像,可能发生什么类型的攻击或漏洞?如何防止此类攻击?

为什么不验证文件是有效的映像?:

from PIL import Image
image = Image.open(file)
image.verify()

正如另一位发帖者所建议的那样,您确实可以尝试转换并检查是否抛出了异常,但verify((可能会更快。

或者你可以尝试检测类型?:

import imghdr
path = 'Image.jpg'
imghdr.what(path)

from PIL import Image
image = Image.open('myimage.png')
image.format

使用以上任何一种方法,都可以确定该文件是否真的是图像。如果它不是图像,那么就认为该文件是伪造的,并且不要在任何网页上输出它。如果不输出文件,就不会有来自该向量的XSS风险,因为即使文件是HTML,如果不在页面上输出,也不会影响页面。

最好的解决方案来自Pillow库本身。

即使有人可以操纵HTML文件的标题,使其看起来像PNG文件,但当你尝试对它们进行一些操作(比如调整大小(时,它根本不起作用,并引发错误,所以你可以在try-except块中捕获它,并警告/标记用户的恶意。

如果你不想降低给你的任何图像的质量,那么你可以调整到原始图像的大小,这将在不影响图像质量的情况下工作。

最新更新