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.

Вернуться на верх