Python Django如何验证POST参数

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

我通过POST请求将一些参数传递给django。我如何验证一个参数是否是整数、字符串,以及里面是否没有像代码注入这样不安全的东西? 我可以使用django函数吗

例如:

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 &lt;script&gt;evil()&lt;/script&gt; example'
>进口漂白剂
>>>bleach.clean('一个邪恶的()例子')
u'an scriptevil()/脚本示例'
您可以在Django官方文档中找到有关安全性的更多信息:


如果您使用的是Django REST框架,那么您可以在视图中执行如下操作

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