Django UpdateView - предотвращение фальсификации URL-адресов
У меня есть модель Contact. В url.py есть:
path('contact/update/<int:id>/', views.ContactUpdate.as_view(), name='contact-update'),
UpdateView выглядит следующим образом:
class ContactUpdate(UpdateView):
model = Contacts
form_class = ContactForm
template_name = 'contact_detail.html'
success_url = reverse_lazy('test:contacts-list')
Пк не включен в поля формы.
class ContactForm(ModelForm):
class Meta:
model = Contacts
fields = ['name', 'company', 'addr1', 'addr2', 'city', 'state', 'zip']
Но пк отправляется в url. Форма работает в шаблоне и контакты сохраняются и редактируются с помощью вышеуказанного представления без проблем.
Однако, если злоумышленник (вошедший в систему пользователь) изменит url сообщения, чтобы отразить другой pk, Django с радостью отредактирует взломанную запись.
ORIGINAL GET URL: http://test.com/test/contact/update/2/
HACKED POST URL: http://test.com/test/contact/update/3/
Django обновит запись с pk, равным 3. Токены session и csrf все действительны, поэтому ничто не является ошибкой.
Есть ли способ предотвратить это, кроме использования переменной сессии с uuid, которая отправляется в форму и используется по возвращении для получения оригинального pk?
Спасибо за любой совет.
Пользователи были ограничены в редактировании только контактов в их штате.Таким образом, они имели права на редактирование модели Contacts. Я решил эту проблему, используя UserPassesTestMixin для проверки прав пользователей на get и post в UpdateView.