小编Lis*_*Lis的帖子

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

我目前正在开发一个使用 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 脚本(基本上是跨站点脚本)。

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

python django django-rest-framework

4
推荐指数
2
解决办法
2569
查看次数

对于未经身份验证的用户,AllowAny CreateAPIView 返回 401

我将 DRF 与djangorestframework-simplejwt包一起使用。在我的settings.py中:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

...

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication',
    ),
}

SWAGGER_SETTINGS = {
   'SECURITY_DEFINITIONS': {
      'Bearer': {
            'type': 'apiKey',
            'name': 'Authorization',
            'in': 'header',
            'description': 'E.g. \'Bearer jwt.token.here\''
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的views.py中:


...

class PublicCreateView(generics.CreateAPIView):
    """
    Should be available for unauthenticated users
    """
    serializer_class = PublicThingSerializer

    def post(self, request, *args, **kwargs):
        return Response("It works!", 200)
...
Run Code Online (Sandbox Code Playgroud)

然而由于某种原因,此视图返回401未经身份验证的用户的响应。我尝试了很多事情,我得到的最好的结果是注意到当我完全删除配置时REST_FRAMEWORKsettings.py …

django jwt django-rest-framework django-rest-framework-simplejwt

1
推荐指数
1
解决办法
742
查看次数