2012-12-25 40 views
0

當我添加,編輯或刪除一個對象時,我使用的是URL中對象的id(pk),這當然會將該特定對象的全局主鍵ID暴露給用戶。我想用隱藏這些全球ID的URL和/或從一個窗體中隱藏的字段,而使用POST。隱藏主鍵或ID暴露

爲了讓它更清晰一點,讓我用一個例子來解釋一下。所以說,我有以下模型。

Models.py

class Profile(User) 
    # Some fields here 


class Student(Profile) 
    # some fields here 


class Teacher(Profile) 
    # Some fields here 


class Project(models.Model) 
    student = models.ForeignKey(Student) 
    # some more fields here. 

根據上述模型,說我要編輯或刪除現有Project實例。我目前做的是使用id(pk)作爲參數中的URL如下:

Urls.py

url(r'^project/(?P<id>\d+)/edit/$', 'app.views.edit_project'), 
url(r'^project/(?P<id>\d+)/delete/$', 'app.views.delete_project'), 

這將是要麼完全隱藏這些ID的URL中的最佳方法?

有沒有辦法讓每個學生都有項目ID?像添加另一個auto_increment列到項目表?

+0

你爲什麼覺得這會有用? –

+0

對於我猜測的攻擊者來說是安全的嗎? ,我個人認爲公開揭露任何實體的主要關鍵字並不是一個好主意。 – Amyth

+1

如果您的項目執行正確的授權,那麼誰看看主鍵將無法辨別出太多。 –

回答

3

安東尼提出的SlugField()選項是一個好主意。在該字段上添加一個唯一約束(模型定義中的unique=True)。然後寫下你的urls.py這樣的規則:

url(r'^project/(?P<slug>[A-Za-z0-9_\-]+)/edit/$', 'app.views.edit_project'), 
url(r'^project/(?P<slug>[A-Za-z0-9_\-]+)/delete/$', 'app.views.delete_project'), 
+0

謝謝,因爲安東尼建議我設法改變代碼使用'SlugField()'而不是'pk'並且它按預期工作。另外,我確實發現這個片段非常有用,可以用於自動填充'save()' – Amyth

+0

上的slu For。對於自己來說,使用Django的內置slugify函數。運行'從django.template.defaultfilters import'slugify'然後'slugify(myString)'。你可以把它放在你的'save()'覆蓋中。 –