首頁  >  文章  >  後端開發  >  如何防止PHP中的多個表單提交?

如何防止PHP中的多個表單提交?

Susan Sarandon
Susan Sarandon原創
2024-11-10 06:43:02495瀏覽

How to Prevent Multiple Form Submissions in PHP?

在PHP 中透過多次點擊來對抗多個表單提交

表單提交有時可能會無意中連續多次觸發,從而導致不良行為和數據不一致。這種情況可能是由於多種因素造成的,例如多次點擊按鈕或表單處理速度慢。 PHP 提供了防止多次提交的技術,確保資料完整性。

防止多次表單提交

為了防止多次提交,一種廣泛使用的方法是利用每次顯示表單時產生的令牌。然後,該令牌與表單一起提交並在伺服器端進行驗證。這種方法的關鍵好處在於它有可能減輕 CSRF(跨站請求偽造)攻擊和重播攻擊。

一個實際範例

下面的範例示範如何建立一個獨特的每個表單顯示的令牌,以及表單提交時的驗證。

<?php
session_start();

/**
 * Generates a unique token for the form
 * @return string The token
 */
function getToken(){
  $token = sha1(mt_rand());
  if(!isset($_SESSION['tokens'])){
    $_SESSION['tokens'] = array($token => 1);
  }
  else{
    $_SESSION['tokens'][$token] = 1;
  }
  return $token;
}

/**
 * Validates the token and removes it from the list of valid tokens
 * @param string $token The token
 * @return bool Validation status
 */
function isTokenValid($token){
  if(!empty($_SESSION['tokens'][$token])){
    unset($_SESSION['tokens'][$token]);
    return true;
  }
  return false;
}

// Check if a form has been submitted
$postedToken = filter_input(INPUT_POST, 'token');
if(!empty($postedToken)){
  if(isTokenValid($postedToken)){
    // Process form
  }
  else{
    // Handle error
  }
}

// Get a token for the currently displayed form
$token = getToken();
?>
<form method="post">
  <fieldset>
    <input type="hidden" name="token" value="<?php echo $token; ?>"/>
    <!-- Form content -->
  </fieldset>
</form>

透過以下方式增強用戶體驗重定向

將基於令牌的方法與重定向相結合,可以確保正確的向後和向前導航行為,從而增強用戶體驗。透過實現POST/重定向/GET設計模式,可以防止使用者點擊後退按鈕或刷新頁面時意外重新提交。

以上是如何防止PHP中的多個表單提交?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn