【发布时间】:2020-08-06 23:02:24
【问题描述】:
我正在创建一个用户可以上传图片的网站。我正在使用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 上,可能会发生哪些类型的攻击或漏洞?以及如何防止此类攻击?
【问题讨论】:
-
拥有单独的域名(即使它们托管在同一台服务器上)和主域的 CORS 策略应该可以防止大多数攻击。您还可以考虑在存储之前使用 PIL/Pillow 对上传的 PNG(和其他图像)文件进行重新编码,以确保它们是合法的图像文件。
-
@Selcuk 从 S3 提供的图像是否受到 CORS 策略的限制?它本身是从与我的域不同的
s3.amazon.x提供的。 -
同源策略应该由你的主域名执行,而不是s3。使用 s3(或任何其他域名)只是让您的 Web 服务器区分来自主域名和来自媒体文件的请求。请参阅django-cors-headers 了解 Django 特定实现。
-
@Selcuk 我确实设置了 cors 设置,因为我使用的是 Django REST,是我需要处理的
CORS_ORIGIN_WHITELIST吗?还是我需要做其他事情来防止此类攻击? -
很难保证某些东西可以抵御各种攻击,但这是一个好的开始。欢迎来到信息安全。