Python Django如何验证POST参数
我通过POST请求将一些参数传递给django。我如何验证一个参数是否是整数、字符串,以及里面是否没有像代码注入这样不安全的东西? 我可以使用django函数吗 例如:Python Django如何验证POST参数,python,django,validation,post,parameters,Python,Django,Validation,Post,Parameters,我通过POST请求将一些参数传递给django。我如何验证一个参数是否是整数、字符串,以及里面是否没有像代码注入这样不安全的东西? 我可以使用django函数吗 例如: if request.method == 'POST': print request.POST.get('user_comment') 如何检查POST参数是否包含我的系统的非危险字符串?差不多 request.POST.get('user_comment').is_valid() 谢谢。最简单的方法是创建表单: f
if request.method == 'POST':
print request.POST.get('user_comment')
如何检查POST参数是否包含我的系统的非危险字符串?差不多
request.POST.get('user_comment').is_valid()
谢谢。最简单的方法是创建表单:
from django import forms
class SingleForm(forms.Form):
user_comment = forms.CharField(max_length=100)
然后
或者您想在没有表单的情况下执行此操作?要检查
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等存在不同的威胁,因此无法将其全部过滤。关于代码注入,您可以使用以下方法清理用户输入:
>>> import bleach
>>> bleach.clean('an <script>evil()</script> example')
u'an <script>evil()</script> example'
>进口漂白剂
>>>bleach.clean('一个邪恶的()例子')
u'an scriptevil()/脚本示例'
您可以在Django官方文档中找到有关安全性的更多信息:
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,请查看
是如何有效的()
是如何实现的。基本上,它调用的函数run\u validators()。希望这有帮助 > P>你可以考虑在你的领域之前使用CeaveDeX来验证它。
例如,如果您想检查用户名,并且为其定义了一个模型,如
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文件,其中说明:
字段子类上的clean()方法负责运行到_python()、validate()和运行_validators()以正确的顺序并传播其错误。如果任何方法在任何时候引发ValidationError,验证将停止并引发该错误。此方法返回干净的数据,然后将其插入表单的干净的\u数据字典中
干净的()方法在表单子类上调用,其中替换为表单字段属性的名称。此方法执行特定于该特定属性的任何清理,与该属性的字段类型无关。此方法未传递任何参数。您需要在self.cleaned_数据中查找字段的值,并记住此时,它将是一个Python对象,而不是表单中提交的原始字符串(它将在cleaned_数据中,因为上面的general field clean()方法已经清理了数据一次)。“那么is_valid()函数是否只检查参数是否适合CharField或IntegerField等。xss没有任何功能,等等?django中有不同的方法来防止XSS或SQL注入。XSS的正确方法内置在模板中。对于SQL注入,如果您不使用原始查询或extra
,ORM将完成这项工作。此方法希望每个API请求背后都有一个模型。我的意思是拥有一个序列化程序意味着拥有一个模型。如果我只想在没有模型的情况下验证API请求,那该怎么办?如果您知道request.data包含的参数/字段,那么完全可以使用没有Django模型的序列化程序。是的,我可以在阅读文档并亲自尝试后弄明白这一点。
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