首页 > 解决方案 > 在 Django 中防止恶意 PNG

问题描述

我在 Django 网站上发现了以下安全通知:

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

不幸的是,没有关于如何保护网站免受恶意 PNG 攻击的附加信息,所以我有一些问题:

  1. 我应该如何配置我的网络服务器(nginx)?
  2. 如何将 html 生成为 PNG 以将其上传到服务器并确保它不会显示为 html?
  3. 我应该在上传时添加额外的图像检查吗?什么是最好的解决方案/库(可能是 libmagick)?

标签: djangosecuritynginx

解决方案


根据Django 文档

在框架级别不存在安全验证所有用户上传的文件内容的防弹技术解决方案,但是,您可以采取一些其他步骤来缓解这些攻击:

  1. 通过始终提供来自不同顶级或二级域的用户上传内容,可以防止一类攻击。这可以防止任何被同源策略保护(例如跨站点脚本)阻止的漏洞利用。例如,如果您的网站在 example.com 上运行,您可能希望从 usercontent-example.com 之类的网站提供上传的内容(MEDIA_URL 设置)。仅提供来自 usercontent.example.com 等子域的内容是不够的。

  2. 除此之外,应用程序可以选择为用户上传的文件定义允许的文件扩展名的白名单,并将 Web 服务器配置为仅提供此类文件。

使用 CDN似乎也可以帮助解决某些类型的问题。


推荐阅读