フォームを送信する際、無視できない制限の 1 つは、ユーザーが送信ボタンを連続してクリックしたり、攻撃者が悪意を持ってデータを送信したりする可能性があるため、ユーザーがフォームを繰り返し送信できないようにすることです。データベースにデータを変更または追加すると問題が発生するためです。
それでは、フォームが繰り返し送信される現象を回避するにはどうすればよいでしょうか?多くの側面から始めることができます:
まず、フロントエンドに制限を加えます。ボタンが 1 回クリックされると、フロントエンド JavaScript が無効になります。この方法は単に送信ボタンの複数回のクリックを防止するだけですが、ユーザーが JavaScript スクリプトを無効にすると機能しないという欠点があります。
2 番目に、送信後にページをリダイレクトできます。つまり、送信後に新しいページにジャンプできます。これにより、主に F5 キーの繰り返しの送信が回避されますが、欠点もあります。
第三に、データベースには一意のインデックス制約があります。
4 番目のステップは、セッション トークンを確認することです。
次に、セッション トークンを使用してフォームの繰り返し送信を防ぐ簡単な方法について学びましょう。
フォームに入力非表示フィールド、つまり type="hidden" を追加します。このフィールドの値は、ページが更新されたときにトークン値が変更されるかどうかを判断します。トークンの値が正しい場合 フロントデスクによって送信された場合 トークンが背景と一致しない場合、それは重複送信とみなされます。
< ?php /* * PHP简单利用token防止表单重复提交 */ session_start(); header("Content-Type: text/html;charset=utf-8"); function set_token() { $_SESSION['token'] = md5(microtime(true)); } function valid_token() { $return = $_REQUEST['token'] === $_SESSION['token'] ? true: false; set_token(); return $return; } //如果token为空则生成一个token if(!isset($_SESSION['token']) || $_SESSION['token']=='') { set_token(); } if(isset($_POST['web'])){ if(!valid_token()){ echo "token error,请不要重复提交!"; }else{ echo '成功提交,Value:'.$_POST['web']; } }else{ ?> <form method="post" action=""> <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>"> <input type="text" class="input" name="web" value="www.jb51.net"> <input type="submit" class="btn" value="提交" /> </form> <?php } ?>
上記は、フォームの重複送信を防ぐための簡単な例です。
その後、実際のプロジェクト開発では、フォーム トークンはより複雑に処理されます。これをトークン検証と呼びます。可能な加工
ソース ドメイン、つまりソースが外部送信であるかどうかを確認すること、実行されるアクション (追加、変更、削除) を照合すること、次に最も重要なことはトークンを構築することです。可逆暗号化アルゴリズムを使用します。
平文はまだ安全ではないため、できるだけ複雑にしてください。