Django通用UpdateView安全性问题

时间:2018-07-22 12:28:05

标签: django python-3.x python-2.7 django-models django-forms

下面的代码允许用户更新他的公司资料,并且工作正常。我面临的问题是,要获取用户的CompanyProfile,我必须在网址中传递“ pk”变量,就像这样

<a class="btn btn-outline-success btn-lg" role="button" href="{% url 'user_profile_update' CompanyProfile.user_id %}"
               style="font-family: 'slabo'">Edit</a>

url(r'^companyprofile_update_form/(?P<pk>\d+)/$', UpdateCompanyProfile.as_view(), name='user_profile_update'),

这是视图

class UpdateCompanyProfile(UpdateView):
    model = CompanyProfile
    form_class = CompanyProfileForm
    # fields = ['contactNumber', 'address', 'areaCode', 'deliveryEmails', 'keywords']
    template_name_suffix = '_update_form'

您可以想象,数据库中有许多用户拥有自己的CompanyProfiles。问题是用户可以更改URL中的pk变量,然后可以访问另一个用户的CompanyProfile,然后对该配置文件执行更新,这当然是未经授权的访问,我如何避免这种情况。

1 个答案:

答案 0 :(得分:0)

您可以为此覆盖get_object()方法:

from django.http import Http404

class UpdateCompanyProfile(UpdateView):
    model = CompanyProfile
    form_class = CompanyProfileForm
    # fields = ['contactNumber', 'address', 'areaCode', 'deliveryEmails', 'keywords']
    template_name_suffix = '_update_form'

    def get_object(self, queryset=None):
        company = super(UpdateCompanyProfile, self).get_object(queryset)
        if company.user != self.request.user:
            raise Http404("Company does not exist")
        return company