我有一个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')
pk不包括在表单的字段中。
class ContactForm(ModelForm):
class Meta:
model = Contacts
fields = ['name', 'company', 'addr1', 'addr2', 'city', 'state', 'zip']
但是pk是在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将以3的pk更新记录。会话和csrf令牌都是有效的,因此没有任何标记为错误。
除了使用带有uuid的会话变量外,还有什么方法可以防止这种情况发生吗?uuid被发送到表单中,并在返回时用于获取原始pk?
谢谢你的建议。
用户只能编辑其状态下的联系人。因此,他们拥有对"联系人"模型的编辑权限。我通过使用UserPassesTestMixin在UpdateView中测试获取和发布的用户权限来解决这个问题。