Django如何验证POST参数

时间:2015-11-20 14:36:58

标签: 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()

感谢。

5 个答案:

答案 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.fieldsrun_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 &lt;script&gt;evil()&lt;/script&gt; example'

您可以在官方Django文档中找到有关安全性的更多信息: