Есть ли другой способ создать более безопасную форму в Django - PullRequest
0 голосов
/ 24 апреля 2011

У меня паранойя об использовании скрытого поля в модели для внешних ключей. Я инициализирую значение, прежде чем отправить форму пользователю для внешних ключей и скрыть их и когда пользователь отправляет обратно значения по почте, я просто сохраняю форму с базовой проверкой. Может ли кто-либо изменить данные в скрытых полях формы по злонамеренным причинам или изменить данные и изменить данные в другой строке? Есть ли другой безопасный способ?

модель:

class company(models.Model):
user=models.ForeignKey(User)
comname=models.CharField(max_length=255)
regcode=models.CharField(max_length=128,blank=True,null=True)

froms:

class companyform(forms.ModelForm):

comname=forms.CharField(label=_("company name"),help_text=_("This name appear on top of forms and printed content"))

regcode=forms.CharField(label=_("Register code "),help_text=_("Registered code of organization in goverment"))

class Meta: 
    model=careunitgeneralsetting
    exclude = ('user',)

вид:

return render_to_response("home_them.html",{"form":unicode(companyform(initial="user":request.user.id)},context_instance=RequestContext(request))

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Я предполагаю, что вы хотите установить company.user на один зарегистрированный ток и предотвратить его изменение.Вы делаете это почти правильно:

  1. Поле исключено из формы, как и должно быть.В конечном счете, однако, безопаснее использовать fields (белый список), чем exclude (черный список) в объявлениях форм.Это предотвращает непредвиденные побочные эффекты при добавлении полей к рассматриваемой модели.

  2. Необходимо указать начальное значение для user, но есть лучший способ - использовать тот факт, что ModelFormиспользуется:

    {"form": CompanyForm(instance=Company(user=request.user))

1 голос
/ 24 апреля 2011

Вы никогда не должны зависеть от браузера, чтобы отправить вам соответствующие данные.Помните, что интерфейс вашего веб-приложения - это не браузер, а HTTP / другой протокол.Всегда будет возможно создать форму, специально созданную для отправки вам искаженных данных.Еще лучше - кто-то может просто открыть терминал telnet и ввести что-нибудь.

Любые данные, поступающие извне, следует считать ненадежными и проверять на сервере.Проверка на стороне клиента - только удобная функция для пользователя, но не мера безопасности.

В Django формы используются для проверки на стороне сервера.Однако вы не можете разделить процесс проверки и предположить, что после проверки данные могут передаваться между клиентом и сервером и оставаться таковыми.Если вы хотите убедиться, что определенные значения остаются неизменными в течение нескольких запросов, используйте переменные сеанса, которые находятся на стороне сервера и поэтому не могут быть изменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...