django - 在 Django 中防止恶意 PNG
问题描述
我在 Django 网站上发现了以下安全通知:
当以不遵循安全最佳实践的方式提供媒体时,Django 的媒体上传处理会带来一些漏洞。具体来说,如果 HTML 文件包含有效的 PNG 标头和恶意 HTML,则该文件可以作为图像上传。该文件将通过 Django 用于 ImageField 图像处理 (Pillow) 的库的验证。当此文件随后显示给用户时,它可能会显示为 HTML,具体取决于您的 Web 服务器的类型和配置。
不幸的是,没有关于如何保护网站免受恶意 PNG 攻击的附加信息,所以我有一些问题:
- 我应该如何配置我的网络服务器(nginx)?
- 如何将 html 生成为 PNG 以将其上传到服务器并确保它不会显示为 html?
- 我应该在上传时添加额外的图像检查吗?什么是最好的解决方案/库(可能是 libmagick)?
解决方案
根据Django 文档:
在框架级别不存在安全验证所有用户上传的文件内容的防弹技术解决方案,但是,您可以采取一些其他步骤来缓解这些攻击:
通过始终提供来自不同顶级或二级域的用户上传内容,可以防止一类攻击。这可以防止任何被同源策略保护(例如跨站点脚本)阻止的漏洞利用。例如,如果您的网站在 example.com 上运行,您可能希望从 usercontent-example.com 之类的网站提供上传的内容(MEDIA_URL 设置)。仅提供来自 usercontent.example.com 等子域的内容是不够的。
除此之外,应用程序可以选择为用户上传的文件定义允许的文件扩展名的白名单,并将 Web 服务器配置为仅提供此类文件。
使用 CDN似乎也可以帮助解决某些类型的问题。
推荐阅读
- python - 如何将 joblib 并行化与不返回任何内容的类内方法一起使用
- python-3.x - 类实例以某种方式包含同一类的不同现有实例的元素
- python - 将顺序特征添加到 1D CNN 分类模型
- sql - 从表中选择单个值
- mongodb - 使用未知索引更新嵌套字段且不影响其他条目
- php - 在我的控制器中声明更多数据库时,Laravel 表单验证不起作用
- powershell - 在 shell 脚本中使用 rsh
- python - 我可以在不必为每条记录运行这些循环的情况下对这些记录进行聚类吗?
- python - 如何使用 Tkinter Listbox 小部件获取 SQLite 3 表中列中的行的值?
- google-sheets - QUERY 源范围的 Google 表格绝对参考