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

Paa*_*ing 7 django amazon-s3

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

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

它告诉我有关此漏洞的信息,但并没有为我提供防范这些漏洞的有效方法。这是网站中排名第三的最易受攻击的攻击。

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

我正在使用 S3 来提供我的媒体文件,它确实说要避免部分中描述的一些漏洞,但没有说明是哪个.

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

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

Pte*_*tyl 5

为什么不直接验证该文件是否是有效图像?:

from PIL import Image
image = Image.open(file)
image.verify()
Run Code Online (Sandbox Code Playgroud)

正如另一张海报所建议的,您确实可以尝试进行转换并检查是否引发异常,但 verify() 可能会更快。

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

import imghdr
path = 'Image.jpg'
imghdr.what(path)
Run Code Online (Sandbox Code Playgroud)

或者

from PIL import Image
image = Image.open('myimage.png')
image.format
Run Code Online (Sandbox Code Playgroud)

使用上述任何一种方法,您都可以确定该文件是否实际上是图像。如果它不是图像,则将该文件视为虚假文件,并且不要将其输出到任何网页上。通过不输出该文件,该向量不存在 XSS 风险,因为即使该文件是 HTML,通过不在您的页面上输出它,也不会危害您的页面。