2012-04-18 72 views
0

我是Django的新手。昨天晚上,我努力工作,讓我可以編輯當前項目中的任何實體;章節,故事和世界。爲了確保我確切地知道哪個數據庫對象正在被修改,我添加了一個數據庫條目到存儲散列的表的'編輯'中,被編輯的對象的類型(例如,'章節')和那個ID對象在數據庫中找到。散列作爲隱藏輸入添加到表單中。Django的update_object通用視圖是否安全?我應該擴展它還是爲了安全而自己創建?

在後端,表單提交後,我抓取散列並使用它來查找數據庫中相關的Edit項。然後我使用它來查找最初正在編輯哪個對象。這是由於兩個原因:

  1. 我可以知道什麼對象是真正被編輯。如果所有表單項目都發生了變化,那麼就沒有什麼可比較的(除了URL)來真正知道正在編輯哪個對象。

  2. 用戶應該無法破解前端做奇怪的事情,如修改錯誤的故事。

今天我發現Django有一個通稱爲update_object的視圖。這似乎爲我處理了很多事情。但考慮到它不會自動使用數據庫來確保正在編輯正確的對象,或者甚至確定正在編輯哪個對象,這是否安全?當然,必須通過修改HTML元素來在前端創建一個簡單的方法。其次,如果這應該是一個問題,你會建議我保留自己的編輯視圖,還是擴展update_object視圖或其他解決方案?

最後,我是否正確地做這件事?如果我沒有以正確的方式考慮解決這個問題,請糾正我。

我不認爲這是一個需要編碼的問題。與Django有關的表單的安全性更像是一個普遍的問題。

感謝,

ParagonRG

回答

1

你知道的問題,哪個對象,他們正在編輯或者通過檢查URL或只是對數據庫ID一個隱藏的表單元素通常被解決。

在接受用戶表單的任何更改之前,您應該驗證用戶是否有權執行他們要求的任何操作,並且這些編輯是有意義的。您通常會在視圖中使用表單驗證器和/或顯式檢查來執行此操作。這是處理這個問題的一種更安全的方式,因爲它可以保證人們不會進行數據庫更改而不允許他們進行數據庫更改,而在您的對象方法中,可以想象他們可以解決這個問題。

如果你採取這種方法,我看不出有什麼理由爲什麼這是一個問題,用戶可能會編輯隱藏的ID字段來假裝編輯不同的對象。當他們可能剛剛進入不同的編輯鏈接時,他們只是用一種愚蠢的迂迴方式來編輯內容。 (另外:如果您使用的是Django 1.3+,最好使用新的基於類的UpdateView,而不是基於函數的update_object。)

+0

謝謝,我沒有注意到那些通用視圖已被棄用!我將不得不亂用UpdateView。另外,有趣的是,我沒有看到隱藏的表單元素,指出哪個對象正在編輯。看看這裏(很短):http://dpaste.com/733945/。這是一個世界對象,它的ID是1.沒有其他可以識別的東西,而且我也沒有看到那個代碼。沒有它,它怎麼會起作用? – Paragon 2012-04-18 21:50:09

+1

@Paragon我想它使用的是URL而不是一個隱藏的ID,這非常相似。碰巧,你可以在這裏看到視圖的來源(https://github.com/django/django/blob/master/django/views/generic/edit.py);如果你追溯到繼承的痕跡,它會在[this method](https://github.com/django/django/blob/master/django/views/generic/detail.py#L19)中找到基於對象的對象在'pk'或'slug'或URL模式中的任何參數上。 – Dougal 2012-04-18 21:56:15

+0

非常有幫助,謝謝。這使我的思想走上正軌。 – Paragon 2012-04-18 22:01:08

相關問題