2012-05-22 54 views
2

假設您有一個包含單個按鈕的網站。如何阻止用戶僞造請求?或者如何檢測假請求?

當該按鈕被按下時,一個Ajax請求被髮送到服務器 - 誰在其數據庫上的內部計數器接收該請求,並增加了1。

的用戶可以複製整個請求(和它的頭),並創建一個腳本來發送無限請求到服務器超載(和亂用計數器)。

我試圖避免:

  1. 記錄用戶的IP
  2. 使用驗證碼

我在我的後端使用PHP。有什麼辦法可以防止這種情況發生?有沒有辦法發送「隱形」請求?

+0

您無法創建隱形請求,但可以通過其他方式解決問題。 –

+0

[.htaccess或PHP保護代碼針對多個快速請求可能的重複](http://stackoverflow.com/questions/2820699/htaccess-or-php-protection-code-against-multiple-speedy-requests) – bfavaretto

回答

2

您可以創建分配給該按鈕的唯一標記,並且只能使用按鈕按鈕提交一次。

這將意味着用戶需要刷新頁面以獲取一個新的按鈕,如果那是一個問題,與用戶,而不是按鈕,令牌關聯

上述方法意味着你需要添加服務器端代碼。你可能可以通過使用諸如evercookie之類的東西來登錄客戶端的按鈕並嘗試阻止用戶發送另一個請求並接收來自用戶的另一個請求 - 我不建議在產品中執行此操作,但它可能很有趣)


生病嘗試爲比特更加清晰:

生成按鈕,以便它提交含有隱藏字段稱爲「uuid是」包含該按鈕的預先生成的UUID的形式。這個uuid將需要保存在數據庫或內存中。如果你使用了一個好的uuid庫,那麼用戶生成現有的uuid的機會是無限小的。

現在,用戶點擊該按鈕和動作去/我的按鈕/?UUID = 3394b0e0-a3bb-11e1的-b3dd-0800200c9a66

現在服務器會檢查UUID是以前生成的。如果是這樣,它將從其存儲的位置刪除uuid,並讓該操作執行任何操作。該UUID不存在,它返回一個404

+0

服務器不知道請求是如何發起的,它只知道它收到請求。所以這個請求可能不會響應按鈕按下。 – RobG

+0

等待掃管笏?沒有按鈕按下結果的請求一些URL,一些處理程序?並且不知道這個處理程序是否知道這個請求是來自按鈕按下的?如果不是,你能編碼嗎? – mkoryak

+0

如果用戶具有標準瀏覽器並使用標準UI功能,則可以確定此類情況。但是您不知道服務器是否屬於這種情況,用戶代理可能不是瀏覽器,甚至無法控制它。 – RobG

0

你不可能知道的請求是如何發起的,所有你能做的就是使它更難以僞造。但是,如果這與安全有關,那麼可以成功僞造你需要最清楚的請求的人就是這樣。所以這可能是無用的(甚至是誤導性的)來嘗試這種安全措施。

你可以嘗試加密密鑰服務器將在一段時間內lmit接受一次,但你還是不會知道請求是如何發起的(你真的不應該依賴於這一點)。按鈕是一種UI功能,可根據用戶代理已配置爲向用戶呈現的任何內容(如果有用戶調用)轉換爲其他UI工件。

2

你的問題被稱爲「跨站點請求僞造」。

解決這個問題的一個好方法是,當帶有按鈕的頁面被調用時,生成一個隨機字符串,將它寫入用戶會話並寫入生成的頁面,然後將它與按鈕按下一起發送(for例如在GET請求中)。

在後端檢查提交的字符串是否與用戶會話中的字符串匹配,然後從會話中刪除該字符串。只有在兩個字符串匹配且不爲空時才繼續。

這樣每個請求的URL只有一次有效,只對最初打開頁面的用戶有效。