2010-11-12 49 views
1

除了我的previous question,這是我決定實施的;它可能不是純粹的P-R-G,但似乎沒問題。謹慎評論?這是否保護我免受頁面重新加載和後退按鈕?

form.php有一個動作;我們稱之爲validate.php。

validate.php是用戶永遠不會看到的;如果驗證所有$_GET,並且如果有效將其寫入數據庫並生成確認頁面的HTML /如果無效,則生成錯誤頁面的HTML以解釋錯誤。

無論HTML生成獲取存儲在一個$_SESSION變量,然後validate.php不叫invalid_input.phpsubmitted.php一個header('Location: <as appropriate>);

最後一個頁面(如果用戶讀取URL)僅包括echo $_SESSION['form_html'];

在我看來,這是對付頁面重新加載和後退按鈕問題的技巧。

還是我試圖重新發明車輪?

+1

這可能會起作用,但請確保您不依賴它來保護您的代碼免受惡意用戶的侵害。一般來說,您還需要後端級別的方法來防止重複提交。 – 2010-11-12 02:30:25

+1

您應該使用POST請求,區別很重要。 – meagar 2010-11-12 03:25:18

+0

+1謝謝,兩者(和,嗯,我使用POST,不GET - 咩,不知道爲什麼我寫的,他說不好意思) – Mawg 2010-11-12 04:01:59

回答

1

首先,你最好保存表單數據,這意味着你可以執行再次驗證。它也將更少的HTML。現在使用的方法存在的問題是它不能防止多個選項卡,因爲$_SESSION對於瀏覽器會話是通用的。

我用來防止重複提交(無PRG)的一種方式是爲每個頁面加載(涉及表單的位置)生成唯一的ID。當我生成唯一的ID時,我將它添加到一個$_SESSION['form_unique_ids']數組中,並將其作爲隱藏字段包含在我生成的每個表單中。然後,在我對錶單提交採取行動之前,我會檢查該會話中是否有唯一的ID。如果是,這是第一次提交表格,我將其從會議中刪除。這樣,如果我嘗試重新提交該頁面,我將知道,因爲該ID不在會話中處理結果。

這可以進行擴展,以便不用存儲單個id,而是使用id作爲數組中的鍵,並讓該值成爲事務的結果。然後:

  1. 如果存在錯誤,那麼也會存儲$_POST數據。然後,重定向到original_form.php?id=unique_id並顯示驗證結果。您可以存儲它們或在那裏重新計算它們。
  2. 如果成功,則存儲成功消息並重定向至success_page.php?id=unique_id。在那裏顯着地顯示成功消息。如果你喜歡,你可以從頁面中刪除它。

您可以選擇在顯示會話數據時刪除會話數據,但這意味着如果他們刷新了編輯頁面,他們將失去驗證消息並保存表單數據。我寧願找到一種方法來擺脫足夠舊的數據,以至於他們不再需要它。

無論如何,其中一些想法可能會有用。然後再次,也許這是太多的努力解決這個問題。您的電話:)

+0

+1謝謝,我喜歡你的建議雖然我不知道你的意思是通過存儲數據(其中?d/b或$ _SESSION?)再次驗證它(爲什麼又如果它有效一次而沒有改變......我錯過了什麼?)謝謝,影子(說,誰是那個蒙面人?) – Mawg 2010-11-12 04:04:23

+1

我在想''__SESSION',我自己。儲存數據佔用的空間較小(因爲存儲html包括數據和打印的表單),並且它更直接在要顯示的頁面上打印表單,而不是在其他地方打印表單如果您不想重新進行驗證,只需將驗證錯誤與'$ _POST'數據一起存儲。理想情況下,您將能夠使用與最初用於打印表格相同的打印代碼(例如,如果它是一個編輯表格)。 – theazureshadow 2010-11-12 04:08:53

+0

+1,但爲什麼我會存儲數據?爲什麼不一次驗證它並將其寫入d/b? – Mawg 2010-11-12 06:40:13

1

只要您使用PHP的重定向你的驗證結束時,您不能重新加載或後退按鈕進入validate.php

+0

謝謝(加一) – Mawg 2010-11-12 04:04:38

相關問題