2011-11-07 159 views
1

一個FORM鍵我有一個形式,我想用戶只能提交一次WHMCS,所以他們不能提交,並刷新重新提交......我在想你重置$ _ POST或重定向,但在這種情況下都不會起作用,我將如何生成一個密鑰並使其唯一可用一次?不能使用mysql。智能的方式來生成與PHP

+0

http://en.wikipedia.org/wiki/Post/Redirect/Get – zerkms

+0

可能重複[如何防止用戶提交表單兩次](http://stackoverflow.com/questions/16814157/how-以防止用戶從提交表單兩次) – Gajus

回答

3

爲什麼不在會話中存儲隨機密鑰?這就是大多數CRSF令牌系統的工作原理:加載表單時,生成密鑰並將其保存在會話中並將其包含在表單中。提交時,比較密鑰並刪除保存的密鑰。

如果你只是不希望用戶意外地重新提交成功提交表單,從@zerkms'評論的鏈接是你想要的:http://en.wikipedia.org/wiki/Post/Redirect/Get

+0

是的,創建一個隨機密鑰,把它放在會話和窗體中,並在接收POST時進行比較。你可以在JavaScript中做一些事情,但是因爲這是在客戶端,所以你不能依賴它。 – Flo

0

當表單被提交設置會話或Cookie及檢查它是否存在。

你也可以存儲在數據庫中的信息,如他們的IP和瀏覽器,如果你想進行長期的檢查,但是這有它自己的問題,所以你永遠不會阻止別人時間的100%。

1

最常見的方式,以避免重複張貼是做

header('location: /'.$your_url_here); 

您完成動作之後。所以你只是重定向到同一頁面,但沒有$ _POST。

+1

我建議加上'出口();'頭後 – Tech4Wilco

+0

對,沒錯,我也這樣做 - 只是忘了在這裏寫:) – oyatek

+0

都能跟得上不能做,作爲頁面需要$ _ POST [「身份證」]在一直。 –

0

我意識到這是一個老問題,但最近我有同樣的問題。即使您在POST後切換到另一個smarty模板文件,如果您希望保留在產品詳細信息頁面(例如),則任何Post/Redirect/Get解決方案似乎都不能在WHMCS上工作。可能是因爲它需要$ _POST [id'],刷新後就會消失。所以我能得到的最接近的是讓它回到產品列表頁面,這不是我想要的,也可能不是原始海報想要的。

我終於想出瞭解決的辦法是提交表單後添加$_SESSION[submitted]變量。你必須根據你在做什麼來自己弄清邏輯。

我的邏輯是這樣的:

if ($_SESSION['submitted'] == 1 && !isset($_POST['somecustomkey'])) { unset($_SESSION['submitted']); }

也就是說在頂部和重置,如果你的POST表單數據不存在「提交」會話密鑰。

然後你寫的信息到你的數據庫或任何前添加一個檢查。

if ($_SESSION['submitted'] != 1) { //Do some stuff with $_POST form data $_SESSION['submitted'] = 1; }

我認爲這很好的滿足的$ _SESSION預期目的,易於實現。