2015-11-20 6 views
3

Передаю некоторые параметры django по запросу POST. Как я могу проверить, является ли параметр целым числом, строкой, а также что в ней нет незащищенных вещей, например, внутри кода? Есть ли функция django, которую я могу использовать?Django как проверить параметры POST

Например:

if request.method == 'POST': 
    print request.POST.get('user_comment') 

Как я могу проверить, если параметр POST содержит неопасную строку для моей системы? Что-то вроде

request.POST.get('user_comment').is_valid() 

Спасибо.

ответ

7

Для проверки того, являются ли данные 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 и т. Д., Поэтому нет возможности фильтровать все это.

+0

Так же функция is_valid() проверяет, не вписываются ли параметры в CharField или IntegerField и т. д. Ничего с xss и т. д. –

+1

Существуют различные способы защиты от XSS или SQL Injection в django. Правильные способы для XSS встроены в шаблоны. Для SQL Injection ORM выполнит задание, если вы не используете необработанные запросы или 'extra' – GwynBleidD

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 

или вы хотите сделать это без формы?

-1

Что касается инъекций кода, вы можете использовать bleach дезинфицировать ввод данных пользователем:

>>> import bleach 
>>> bleach.clean('an <script>evil()</script> example') 
u'an &lt;script&gt;evil()&lt;/script&gt; example' 

Вы можете найти более подробную информацию о безопасности на официальном Джанго документации:

3

Если вы используете 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() реализуется. В принципе, он вызывает run_validators() функция django.db.models.fields. Надеюсь это поможет!

2

Вы можете рассмотреть возможность использования cleaned_ перед своим полем для проверки на нем. Например, если вы хотите, чтобы проверить имя пользователя, и у нас есть модель, определенную для него, как,

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 

Это согласно Джанго документация, которая гласит:

«Метод clean() в подклассе Field отвечает за запуск to_python(), validate() и run_validators() в правильном порядке и распространение их ошибок. Если в любое время любое методов повышают ValidationError, действительный и эта ошибка повышается. Этот метод возвращает чистые данные, которые затем вставляются в словарь cleaned_data формы.

Метод clean_() вызывается в подклассе формы, где заменяется именем атрибута поля формы. Этот метод выполняет любую очистку, специфичную для этого конкретного атрибута, не связанную с типом поля, которым он является. Этот метод не передает никаких параметров. Вам нужно будет искать значение поля в self.cleaned_data и помнить, что в данный момент это будет объект Python, а не исходная строка, представленная в форме (она будет в cleaned_data, потому что общий метод clean() поля , выше, уже очистил данные один раз).