フォームの送信が意図せず連続して複数回トリガーされる場合があり、望ましくない動作やデータの不整合が発生することがあります。この状況は、ボタンの複数回のクリックやフォームの処理の遅さなど、さまざまな要因によって発生する可能性があります。 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 中国語 Web サイトの他の関連記事を参照してください。