2008-10-20 44 views
29

我們都知道老的「禁用提交按鈕」技巧,但處理多個提交服務器端的最佳方式是什麼?我有一個應用程序,它絕對是關鍵表單只能發送一次 - 它處理一張信用卡。我沒有寫出它現在的情況,但作爲一個快速解決方案,我使用了禁用提交技術,但是一些禁用JavaScript的不耐煩的用戶仍然收取了兩次費用。如何處理多個提交服務器端

那麼,有什麼辦法可以避免這種情況?我可以想到幾個 - 我過去曾經使用過一些 - 但我想看看是否有任何有關如何解決這個問題的「最佳實踐」。我正在使用PHP,但我對概念更感興趣。

編輯:我意識到令牌技術,這是我以前使用過的,這個問題或多或少是要看我的方法是否與其他程序員一樣好用。

+0

我們的共識當然似乎是這樣,我們這些優秀的程序員(和我!)使用:-)它是一種功能強大且強大的技術,在大多數應用程序中具有安全性優勢。 – 2008-10-20 16:10:55

+0

聽起來對我很好。 :) – 2008-10-20 19:28:15

回答

27

一個非常有效的方法是將請求一起提交一個令牌,並保存已使用令牌的列表。如果令牌無效,或令牌已被處理,則中止。

令牌可以像遞增整數一樣簡單,存儲在隱藏文本字段中,也可以對其進行加密以提高安全性。通過在創建頁面時生成令牌,對其進行加密,然後確認令牌已生成且尚未處理,可以使此功能更加健壯。

+1

如何處理用戶按下後退按鈕(大多數瀏覽器不重新請求),更改表單中的數據並再次提交相同的標記? – JeremyWeir 2010-08-19 23:06:37

9

在隱藏表單域中包含隨機唯一標記。然後在後端,你可以檢查它是否被提交過。

這是一個好主意,因爲它可以幫助您抵禦XSS攻擊。

3

我不會依賴任何客戶端爲此。爲什麼不在客戶端提交提交按鈕之前爲此事務服務器端生成唯一的ID?客戶端然後必須提交這個令牌,並且你檢查服務器端每個令牌提交一次。

正如其他人所說,令牌可以是遞增整數(+ username)或GUID。

7

您也可以簡單地測試是否在最後一分鐘(或第二次,取決於服務器的延遲)是否進行了相同的事務。大多數人不會使用同一張卡在一分鐘內購買兩本相同的書籍(或其他)。如果您在最後一分鐘內保留了信用卡付款的緩存,並檢查您要製作的信用卡號與您剛​​剛完成的號碼是否一致(相同卡號,相同金額),則可能會發現重複。

-3

無需生成唯一的令牌和所有爵士樂。表單驗證通過後,只需將訪問者重定向到另一個頁面,上面寫着「正在處理您的信用卡」等內容。如果訪問者重新加載頁面,他們將重新加載重定向頁面,而不是POST提交。

0

我有類似的問題。閱讀完這篇文章後,我想一個令牌可能是要走的路。 This post展示了一個很好的實施例子。

相關問題