我有个联络模型。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是在网址中发送的。表单在模板中工作,联系人用上面的视图存储和编辑,没有问题。
但是,如果恶意用户(登录用户)更改post 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。会话和csrf令牌都是有效的,因此没有任何标志为错误。
除了使用带有uuid的会话变量(uuid被发送到表单中并在返回时使用它来获取原始pk )之外,还有什么方法可以防止这种情况吗?
谢谢你的建议。
发布于 2022-08-04 17:09:00
用户仅限于在他们的state.So中编辑联系人,他们对联系人模型有编辑权限。我通过使用UserPassesTestMixin测试UpdateView中get和post的用户权限来解决这个问题。
https://stackoverflow.com/questions/73223843
复制相似问题