ホームページ >バックエンド開発 >PHPチュートリアル >繰り返しの送信を防ぐために PHP フォームにトークンを追加する方法

繰り返しの送信を防ぐために PHP フォームにトークンを追加する方法

藏色散人
藏色散人転載
2020-04-06 16:07:322605ブラウズ

トークントーク

トークンはトークンであり、その最大の特徴はランダム性と予測不可能性です。通常のハッカーやソフトウェアはそれを推測できません。

それでは、トークンの役割は何でしょうか?原理は何ですか?

トークンは通常、フォームの繰り返し送信と csrf 攻撃 (クロスサイト リクエスト フォージェリ) を防ぐための 2 つの場所で使用されます。

どちらも原則としてセッション トークンを通じて実装されます。クライアントがページをリクエストすると、サーバーは乱数のトークンを生成し、そのトークンをセッションに配置して、そのトークンをクライアントに送信します (通常は非表示のフォームを構築します)。次回クライアントがリクエストを送信すると、トークンがフォームとともにサーバーに送信されます。

次に、「アンチ csrf 攻撃」に適用された場合、サーバーはトークン値を検証して、セッション内のトークン値と等しいかどうかを判断します。等しい場合は、リクエストが行われたことを証明できます。有効であり、偽造されていません。

ただし、「フォームの繰り返し送信を防ぐ」目的で使用する場合は、サーバー側で最初に検証した後、セッション内のトークン値が更新されます。ユーザーが繰り返し送信すると、2 番目のトークン値が更新されます。ユーザーが送信したフォーム内のトークンは変更されていないが、サーバー側セッション内のトークンが変更されているため、検証の判定は失敗となります。

上記のセッションアプリケーションは比較的安全ですが、煩雑でもあり、同時に複数のページや複数のリクエストがある場合には、複数のトークンを同時に生成する方法を使用する必要があり、時間がかかります。より多くのリソースが消費され、実行効率が低下します。したがって、セッショントークンの代わりに認証情報をCookieに格納する方法も利用できます。たとえば、「繰り返し送信」の場合、1回目の送信後に送信情報がCookieに書き込まれますが、2回目の送信ではCookieに送信記録がすでにあるため、2回目の送信は失敗します。

ただし、Cookie のストレージには致命的な弱点があり、Cookie が乗っ取られると (XSS 攻撃によりユーザーの Cookie を簡単に取得できます)、再びゲームオーバーになってしまいます。ハッカーは直接 CSRF 攻撃を実行します。

<?php
/*
* PHP简单利用token防止表单重复提交
* 此处理方法纯粹是为了给初学者参考
*/
session_start();
function set_token() {
  $_SESSION[&#39;token&#39;] = md5(microtime(true));
}
function valid_token() {
  $return = $_REQUEST[&#39;token&#39;] === $_SESSION[&#39;token&#39;] ? true : false;
  set_token();
  return $return;
}
//如果token为空则生成一个token
if(!isset($_SESSION[&#39;token&#39;]) || $_SESSION[&#39;token&#39;]==&#39;&#39;) {
  set_token();
}
if(isset($_POST[&#39;test&#39;])){
  if(!valid_token()){
    echo "token error";
  }else{
    echo &#39;成功提交,Value:&#39;.$_POST[&#39;test&#39;];
    echo "<br/>";
    echo "token:".$_SESSION[&#39;token&#39;];
  }
}
?>
<form method="post" action="">
  <input type="hidden" name="token" value="<?php echo $_SESSION[&#39;token&#39;]?>">
  <input type="text" name="test" value="Default">
  <input type="submit" value="提交" />
</form>

推奨学習: PHP ビデオ チュートリアル

以上が繰り返しの送信を防ぐために PHP フォームにトークンを追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。