如何防止 Django REST API CharFields 中的 XSS 攻击?

Lis*_*Lis 4 python django django-rest-framework

我目前正在开发一个使用 Django 2.2 和 djangorestframework 3.9.2 的应用程序。我知道 Django 本身提供了针对 SQL 注入或在 django 模板 (XSS) 中显示内容的保护,但我注意到当我使用 Django REST API 时,我的模型中的所有 CharFields 都不会自动清理。

注意:这个问题不适用于 django 模板。

例如,有一个直接消息模型 ( message/models.py):

class Message(models.Model):
    sender = models.ForeignKey(...)
    receiver = models.ForeignKey(...)
    message = models.CharField(max_length=1200)
    timestamp = models.DateTimeField(...)
    is_read = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

实际上并不阻止任何人发送带有内容的消息<script>alert("Hello there");</script>。它将保存在数据库中并由 REST API 原样返回,允许远程运行任何 JS 脚本(基本上是跨站点脚本)。

这是预期的行为吗?如何防止这种情况发生?

nev*_*ner 8

您可以escape()在序列化程序的验证中使用方法:

from django.utils.html import escape

class MySerializer:
    def validate_myfield(self, value):
        return escape(value)
Run Code Online (Sandbox Code Playgroud)


jaa*_*ap3 5

Django(或 DRF)不会转义任何进入数据库的 html/text 内容。文本仅在使用模板系统显示时才会被转义(除非它在某些时候被标记为安全)。

这样做的原因是 Django 并不真正知道您将使用此文本做什么。对于某些用例,存储 HTML 可能完全没问题,包括脚本标签。

如果您正在寻找一种在输入进入数据库之前对其进行清理的方法,我可以推荐 Mozilla 的bleach库:https : //github.com/mozilla/bleach

我没有使用过django-bleachhttps://django-bleach.readthedocs.io/),但它似乎是一种方便的方式来集成bleachDjango.