2010-08-05 82 views
6

我只是有這個想法,我不知道我是否慢。網絡應用程序:存儲ID隱藏字段安全嗎?

通常,我將我正在編輯的項目的ID存儲在隱藏字段中。然後在後端(我使用PHP/Zend框架btw),我知道它確定哪些項目被編輯。但後來我想,在更安全的情況下,例如。編輯配置文件,用戶可以以某種方式編輯隱藏的字段嗎?然後他可以編輯其他人的個人資料。我知道編輯配置文件,我可以得到ID形式的會話變量,但是如果我有什麼需要我將ID存儲在某處?

我得到ACL(Zend_Acl)我這樣做。基本上從請求中獲取參數params

$id = $req->getParam('id'); 

然後檢查是否允許登錄的用戶編輯該項目。但事情是我不知道這個網址是不是像/users/edit/1其中1是id。但不知何故,隱藏字段變爲2,請求參數是什麼?

你會如何處理這個問題?

回答

10

您必須在客戶端存儲某種id,否則您如何知道要編輯哪個項目?
這並不免費從強制檢查服務器上當前用戶有權編輯/查看編輯的項目。
除此之外,你爲什麼會在乎他如何編輯項目(無論是通過合法使用Web工具,還是編輯隱藏/任何字段)。

+0

我想知道如果id參數在GET和POST中都設置,我會得到什麼值?哪些將被使用? – 2010-08-05 13:22:32

+0

它是在php.ini – 2010-08-05 13:46:06

+0

中定義的那麼當然,這取決於你實際調用的是哪一個。 $ _POST或$ _GET。然後,您可以選擇使用哪一個,並且據我所知,使用全局變量並不是一個好主意。 – webnoob 2010-08-05 13:56:14

1

將ID存儲在隱藏值中並不十分安全。通常,我們在會話變量中存儲ID。

+1

沒有必要使用會話變量。它在語義上更合理(更容易)檢查用戶發佈數據是否有權編輯他們發佈數據的記錄。 – meagar 2010-08-05 13:57:02

+0

啊。 meagar,你說了我的想法!有2個變量,據說shld存儲相同的值,是凌亂的,也許容易出錯 – 2010-08-05 14:12:05

+0

該OP是問如何確定正在編輯的記錄是什麼沒有被改變,即他們如何存儲ID然後回發到服務器查詢記錄,因此ppshein的聲明是正確的。您可以將ID存儲在會話中,以便無法更改,然後檢查該記錄的權限。如果您不知道正在編輯什麼文檔,則無法檢查權限。 – webnoob 2010-08-05 14:35:09

0

它不應該基於用戶提交的任何內容。 您應該始終檢查服務器端的用戶權限。 攻擊者可以準備任何請求到您的服務器。

1

正如ppshein所說,將敏感ID存儲在隱藏變量中並不安全。你會在隱藏的變量中存儲密碼嗎?即使是新手黑客也很容易獲得這些數據。

您需要確保所有訪問控制都由服務器強制執行。

對於您的情況,您需要確保登錄的用戶(會話中的用戶)是正在編輯的配置文件的所有者。或者正在進行編輯的用戶有權編輯該配置文件(例如管理員)

0

同意上述所有要點,但如果您確實需要爲任何原因存儲客戶端,則始終可以加密數據和解密,當你需要使用它時,但使用會話將是處理它的最佳方式,因爲它們不可訪問客戶端。

+0

這不會改變用戶可以更改值tho的事實。 – 2010-08-05 14:13:52

+0

當然這就是服務器端驗證的地方。如果黑客更改了加密ID中的值,那麼它將不再正確解密,因此您會知道有什麼地方出錯。 – webnoob 2010-08-05 14:32:29

+0

然後我認爲在這種情況下加密可能不太有用,因爲id不是祕密。加密與否,我仍然需要檢查用戶是否有權訪問請求的資源。 – 2010-08-06 06:40:19

相關問題