清理 Django Rest Framework 中的输入
Sanitize input in Django Rest Framework
如果我发送类似
的内容
{
"description": "Hello World <script>alert('hacked');</script>"
}
对于我的 django rest 框架视图,我想去掉脚本标签。
- 有没有一种方便的方法可以做到这一点,而不涉及覆盖所有内容并添加
strip_tags
?
- 还要做什么来清理输入?
- 我是否真的过度阅读了 drf 文档中的该部分,还是没有涵盖?
您可以重写视图的 perform_create 方法,并使用一些正则表达式做类似这样的事情
import re
class MyView(generics.CreateAPIView):
......
......
def perform_create(self, serializer):
replacement=re.sub('</*script>','',serializer.validated_data.get('description'))
serializer.save(description=replacement)
这是假设您正在使用 CreateAPIView 或其混入之一。
或者您可以创建一个 custom 序列化程序字段,
class MyCustomField(serializers.CharField):
def to_internal_value(self, data):
data=re.sub('</*script>','',data)
return super(MyCustomField,self).to_internal_value(data)
和
class MySerializer(serializer.ModelSerializer):
description=MyCustomField()
class Meta:
model= MyModel
忽略这里的答案,它们太糟糕了。
使用bleach。你不会得到每一个边缘案例。这是使用库的情况。根据定义,您的客户可以控制客户端。
如果我发送类似
的内容{
"description": "Hello World <script>alert('hacked');</script>"
}
对于我的 django rest 框架视图,我想去掉脚本标签。
- 有没有一种方便的方法可以做到这一点,而不涉及覆盖所有内容并添加
strip_tags
? - 还要做什么来清理输入?
- 我是否真的过度阅读了 drf 文档中的该部分,还是没有涵盖?
您可以重写视图的 perform_create 方法,并使用一些正则表达式做类似这样的事情
import re
class MyView(generics.CreateAPIView):
......
......
def perform_create(self, serializer):
replacement=re.sub('</*script>','',serializer.validated_data.get('description'))
serializer.save(description=replacement)
这是假设您正在使用 CreateAPIView 或其混入之一。 或者您可以创建一个 custom 序列化程序字段,
class MyCustomField(serializers.CharField):
def to_internal_value(self, data):
data=re.sub('</*script>','',data)
return super(MyCustomField,self).to_internal_value(data)
和
class MySerializer(serializer.ModelSerializer):
description=MyCustomField()
class Meta:
model= MyModel
忽略这里的答案,它们太糟糕了。
使用bleach。你不会得到每一个边缘案例。这是使用库的情况。根据定义,您的客户可以控制客户端。