2013-11-21 47 views
0

首先,我意識到還有其他問題與此類似,但它們不包含對我的問題的任何明確的解決方案。停止重複提交或雙擊提交

當客戶提交訂單時,我需要能夠正確阻止我的處理腳本針對該特定訂單運行多次。

/payment - 客戶填寫他們的所有細節,並提交訂單

/process_order - 收集的所有數據和處理訂單。

發生了什麼事情是我的訂單正在被部分處理,然後再次處理完全...我只能假設這是因爲客戶要麼雙擊提交按鈕,要麼點擊提交按鈕第二次,因爲該過程尚未完成,並且瀏覽器尚未重定向到「謝謝」頁面...

我只能使用jQuery在第一次單擊事件時禁用按鈕,但我會也想知道我可以在服務器端做些什麼來防止這種情況發生。

回答

1

一個可能的解決方案是爲表單創建一個隨機標記,並在顯示錶單時將其存儲在會話中。

$_SESSION['formNonce'] = md5(time() . uniquid()); 

當生成的形式,將其添加爲隱藏字段:處理時

<input type="hidden" name="formNonce" value="<?php echo($_SESSION['formNonce']); ?>"> 

然後,你要做的第一件事是驗證隨機數是在會話,然後將其刪除。這樣,第二次提交將不會通過驗證,因爲nonce令牌已被刪除。

會有一些調整和錯誤檢查到所有這些,但再加上JavaScript按鈕禁用可能是一個可行的解決方案。

0

例如,您可以使用「防僞助聽」方法。一旦用戶確實訪問了一個頁面,就會分配一個tocken。首先嚐試提交該頁面將從有效列表中刪除託肯,以便進一步嘗試失敗。

+0

你能舉一個例子嗎? – dcolumbus

+0

http://stackoverflow.com/questions/16276513/how-to-create-an-anti-request-forgery-state-token-in-google-server-side-sign-up –

+0

我看到這個答案几個除了一般性陳述之外,它並沒有告訴我任何事情。我需要的例子意味着什麼... – dcolumbus