我通过POST请求将一些参数传递给django。如何验证参数是否为整数,字符串以及内部没有代码注入等不安全的东西? 我可以使用django功能吗?
例如:
if request.method == 'POST':
print request.POST.get('user_comment')
如何检查POST参数是否包含系统的非危险字符串?像
这样的东西request.POST.get('user_comment').is_valid()
感谢。
答案 0 :(得分:12)
要检查POST
数据是否安全,具有正确的类型等,您可以使用django中的表单。例如,如果您需要3个必需参数,一个字符串和2个整数,则可以创建表单:
from django import forms
class MyValidationForm(forms.Form):
first = forms.CharField()
second = forms.IntegerField()
third = forms.IntegerField()
在视图中使用它:
if request.method == 'POST':
form = MyValidationForm(request.POST, request.FILES)
if not form.is_valid():
# print some error here
else:
# do whatever you like
如果字符串不包含危险的内容,则进行过滤,没有通用解决方案。数据库,XSS等存在不同的威胁,因此无法对其进行过滤。
答案 1 :(得分:5)
如果您正在使用Django REST Framework,那么您可以在视图中执行以下操作。
from rest_framework import status
from rest_framework.views import APIView
class MyView(APIView):
def post(self , request):
serializer = MySerializer(data = request.data)
if serializer.is_valid():
serializer.save()
return Response({"status" : "Success"} , status = status.HTTP_201_CREATED)
如果您不使用DRF,请查看serializers.py,了解is_valid()
的实施方式。基本上,它调用django.db.models.fields的run_validators()
函数。希望这有帮助!
答案 2 :(得分:3)
您可以考虑在字段前使用cleaning_对其进行验证。 例如,如果你想检查用户名,你有一个为它定义的模型,如
class MyModel(models.Model):
username = model.CharField(max_length = 255)
然后同样你有一个像
下面的表格class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['username']
def clean_username(self):
username = self.cleaned_data.get('username')
""" this will give you the actual username from the field
Now you may get that validated
"""
if username == "blah blah":
return forms.ValidationError("This isnt any name!")
else:
return username
这是根据django文档说的:
" Field子类上的clean()方法负责以正确的顺序运行to_python(),validate()和run_validators()并传播它们的错误。如果在任何时候任何方法引发ValidationError,则验证停止并引发该错误。此方法返回干净数据,然后将其插入到表单的cleaning_data字典中。
在表单子类上调用clean_()方法 - 其中将替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与其所属的字段类型无关。此方法未传递任何参数。您需要在self.cleaned_data中查找该字段的值,并记住此时它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaning_data中,因为一般字段clean()方法,上面,已经清理了一次数据。"
答案 3 :(得分:2)
最简单的方法是创建表单:
from django import forms
class SingleForm(forms.Form):
user_comment = forms.CharField(max_length=100)
然后
comment = SingleForm(request.POST or None)
if comment.is_valid():
# here everything is cleaned and safe
或者你想在没有表格的情况下这样做?
答案 4 :(得分:0)
关于代码注入,您可以使用bleach来清理用户输入:
>>> import bleach
>>> bleach.clean('an <script>evil()</script> example')
u'an <script>evil()</script> example'
您可以在官方Django文档中找到有关安全性的更多信息: