On Sat, Jul 4, 2015 at 1:42 AM, Peter of the Norse
<[email protected]> wrote:
> You can’t have it both ways. Either exposing the PK is a security flaw or it 
> isn’t. It’s just as easy for nefarious n’er-do-wells to edit the form’s URL 
> as a hidden field. In either case, if you are using object-level permissions, 
> more checks (not made automatic in Django) are necessary. Having the ID 
> passed as a parameter doesn’t necessitate, hinder, or alleviate running these 
> checks.


the easiest way to make forget PKs a non-issue is to never do things like:

myobj = MyModel.objects.get(pk=pk)

instead, do things like:

myobj = get_object_or_404(request.user.accessible_obj_set, pk=pk)

where the 'accessible_obj_set' is either a reverse foreign key, or
some method that returns a queryset with apropriate filters to return
only the rows that a given user can access.



> If you can come up with a method that associates form data with a database 
> row that doesn’t involve the PK, I would love to know. Keep in mind that most 
> tables only have the one unique identifier.

there are many fans of using UUIDs as primary key.  myself, i use them
for any user-visible record when there might be several instances of
the same code.  this way i can merge or split datasets without
changing user-visible references.


-- 
Javier

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAFkDaoTHDBgK2v5Po09cShjQt7VoipA50BcoqawP6MymMmk1uQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to