ホームページ >バックエンド開発 >PHPチュートリアル >繰り返しの送信を防ぐために PHP フォームにトークンを追加する方法
トークントーク
トークンはトークンであり、その最大の特徴はランダム性と予測不可能性です。通常のハッカーやソフトウェアはそれを推測できません。
それでは、トークンの役割は何でしょうか?原理は何ですか?
トークンは通常、フォームの繰り返し送信と csrf 攻撃 (クロスサイト リクエスト フォージェリ) を防ぐための 2 つの場所で使用されます。
どちらも原則としてセッション トークンを通じて実装されます。クライアントがページをリクエストすると、サーバーは乱数のトークンを生成し、そのトークンをセッションに配置して、そのトークンをクライアントに送信します (通常は非表示のフォームを構築します)。次回クライアントがリクエストを送信すると、トークンがフォームとともにサーバーに送信されます。
次に、「アンチ csrf 攻撃」に適用された場合、サーバーはトークン値を検証して、セッション内のトークン値と等しいかどうかを判断します。等しい場合は、リクエストが行われたことを証明できます。有効であり、偽造されていません。
ただし、「フォームの繰り返し送信を防ぐ」目的で使用する場合は、サーバー側で最初に検証した後、セッション内のトークン値が更新されます。ユーザーが繰り返し送信すると、2 番目のトークン値が更新されます。ユーザーが送信したフォーム内のトークンは変更されていないが、サーバー側セッション内のトークンが変更されているため、検証の判定は失敗となります。
上記のセッションアプリケーションは比較的安全ですが、煩雑でもあり、同時に複数のページや複数のリクエストがある場合には、複数のトークンを同時に生成する方法を使用する必要があり、時間がかかります。より多くのリソースが消費され、実行効率が低下します。したがって、セッショントークンの代わりに認証情報をCookieに格納する方法も利用できます。たとえば、「繰り返し送信」の場合、1回目の送信後に送信情報がCookieに書き込まれますが、2回目の送信ではCookieに送信記録がすでにあるため、2回目の送信は失敗します。
ただし、Cookie のストレージには致命的な弱点があり、Cookie が乗っ取られると (XSS 攻撃によりユーザーの Cookie を簡単に取得できます)、再びゲームオーバーになってしまいます。ハッカーは直接 CSRF 攻撃を実行します。
<?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); 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['test'])){ if(!valid_token()){ echo "token error"; }else{ echo '成功提交,Value:'.$_POST['test']; echo "<br/>"; echo "token:".$_SESSION['token']; } } ?> <form method="post" action=""> <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>"> <input type="text" name="test" value="Default"> <input type="submit" value="提交" /> </form>
推奨学習: PHP ビデオ チュートリアル
以上が繰り返しの送信を防ぐために PHP フォームにトークンを追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。