2013-04-30 69 views
0

我通過在PHP的每個表單的隱藏輸入中包含一個令牌來實現CSRF保護。當然,每個令牌只能使用一次。如何在不觸發CSRF保護的情況下更改多少html表單?

但是,有些工具可以改變輸入,例如任何Web開發工具。例如,我可以更改頁面上的輸入表單:我可以啓用禁用複選框,並且可以將輸入框更改爲textarea框,而無需重新加載頁面或類似的東西。 CSRF不會抓住這些變化。

那麼,我需要驗證多少表格才能保證安全?我是否需要驗證每一個輸入以確保它沒有改變,包括選擇,複選框,隱藏輸入等?當然,假設這些沒有被改變是不安全的?

+2

不,你不能確保任何通過'$ _POST'或'進來$ _GET'還沒有被操縱。 – 2013-04-30 16:12:16

+0

永遠不要相信用戶提供的內容。如果一個字段是有效的,那麼驗證它是重要的。例如,一個電子郵件地址可能值得驗證,但一個評論框可能只需要檢查以查看它是否爲空。 – Anigel 2013-04-30 16:18:45

回答

2

您需要驗證(在服務器端)需要驗證的所有內容。究竟需要驗證什麼取決於許多因素和個人選擇。其中一些可能是爲了安全起見,但在很多情況下只需要最低限度的安全。大部分驗證是爲了改進或創建用戶體驗。

例如,您可以檢查他們是否輸入了有效的電子郵件地址。如果他們沒有,你可以給他們一個消息。如果你不這樣做,沒有什麼不好的事會發生在你的應用程序上,但用戶將無法收到你的電子郵件。

還有驗證衛生之間的一個重要區別。衛生是爲了安全(例如防止注射)。確認已完成,以確保輸入符合要求,以正確地與您的應用程序一起工作,儘管不正確的輸入可能是良性的。消毒的惡意輸入也可能有效。

所有輸入必須被清潔。沒有輸入需要進行驗證,所以它真的取決於你。

CSRF保護與驗證無關。它所做的只是防止用戶使用來自外部源的表單發出請求,因爲生成並查看令牌的唯一方法是首先向您的站點發出請求。

+0

感謝您的解釋。讓我問一個簡單的例子:如果我想允許用戶刪除他發佈的帖子,我可以創建一個名稱=「delete_post」和value =「[#post_id]」的表單提交按鈕。現在,爲了讓用戶甚至可以看到該按鈕,他必須是該帖子的所有者。在這種情況下,一旦他按下按鈕,是否需要重新檢查他是否爲「delete_post」值的所有者?是否有可能將此值更改爲其他人的帖子?我覺得我只是一直重複做同樣的重複驗證。 – 2013-04-30 16:39:57

+1

@ user371699是的,你需要進行身份驗證檢查,但它應該是相當微不足道的。例如,'DELETE FROM post WHERE user_id =? AND id =?'。 'user_id'可能已經在會話中 – 2013-04-30 16:45:36

+0

毫無疑問這是微不足道的,但在我的情況下,有很多檢查要做。非常感謝解釋。 – 2013-04-30 17:05:06

2

我們正在嘗試使用CSRF來確保請求來自可靠來源。例如,你的情況你需要做的是確保隱藏字段中的值是理智的。只有當它與表單由服務器呈現時所提供的相同時,它纔可能是理智的(前提是您的令牌足夠強大)。

現在,表單中的字段是否已更改,僅僅是您的應用程序邏輯。它與csrf沒有任何關係。如果令牌是理智的,那麼它來自正確的來源。現在,如果是同樣的人在表單中輸入了例如不在csrf的範圍內。

0

我認爲你在這裏得到了錯誤的結局。令牌發送時不是表單的哈希。

這種方式的工作原理是將您的唯一標記存儲在表單的隱藏字段中,並在服務器原始頁面時存儲到會話中。

當您從用戶處獲取頁面POSTed/GET時,您檢查頁面上的標記與以前存儲在該會話中的標記相同。

必須仍允許更改字段,否則您的用戶將無法在表單上輸入任何數據。您只是檢查您是否獲得了與您發送的表單相同的表單,因爲該標記是相同的,而不是來自其他地方的標記,即它不是跨站點請求僞造。

在將數據存儲到數據庫之前,您仍然必須驗證所有字段並進行任何數據準備。

Reading1 Reading2

相關問題