ホームページ  >  記事  >  バックエンド開発  >  PHP フォーム保護のヒント: フォームの繰り返し送信を防ぐ方法

PHP フォーム保護のヒント: フォームの繰り返し送信を防ぐ方法

WBOY
WBOYオリジナル
2023-06-24 11:50:131812ブラウズ

データ送信に PHP フォームを使用する場合、フォームの送信が繰り返し行われるという問題がよく発生します。これにより、データが不正確になったり、さらに悪いことにシステムのクラッシュが発生したりする可能性があります。したがって、重複した提出を防ぐ方法を理解することが非常に重要です。この記事では、繰り返されるフォーム送信の問題を効果的に防止するために役立つ、PHP フォーム保護テクニックをいくつか紹介します。

1. フォームにトークンを追加する

フォームにトークンを追加することは、繰り返しの送信を防ぐ一般的な方法です。この方法は、一意のランダム値を含む非表示フィールドをフォームに追加することで機能します。フォームが送信されると、PHP コードはこの値がサーバーに保存されている値と一致するかどうかを確認します。一致しない場合は、フォームが繰り返し送信されたことを意味し、データは処理されません。以下は、トークンの基本的な使用例です。

<?php
  session_start();
  if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['token'])) {
    $token = $_POST['token'];
    if ($_SESSION['token'] === $token) {
      //处理表单数据
      //...
      unset($_SESSION['token']);
    } else {
      echo '表单已提交!';
    }
  } else {
    $token = md5(uniqid(rand(), true));
    $_SESSION['token'] = $token;
?>
  <form method="post">
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <!--其他表单元素-->
    <button type="submit">提交</button>
  </form>
<?php } ?>

この例では、まずリクエストが POST であるかどうかを確認し、POST である場合は、フォーム内のトークン値が一致するかどうかを確認します。トークンが一致する場合は、フォーム データを処理します。データを処理した後、このトークンは不要になったので、unset 関数を使用して SESSION からトークンを削除します。トークンが一致しない場合、フォームは 2 回送信されており、フォーム データは処理されません。リクエストが POST でない場合は、新しいトークンを生成して SESSION に保存し、フォームに追加します。

2. リダイレクトを使用する

フォームを送信した後も同じ URL を使用すると、フォームが繰り返し送信されます。これを回避するには、リダイレクトを使用できます。この手法には、フォームの送信後に元のフォーム ページではなく別のページにユーザーをリダイレクトする中間ページが含まれます。以下は、リダイレクトを使用してフォームの繰り返し送信を防ぐ例です。

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    //处理表单数据
    //...
    header('Location: success.php');
    exit;
  }
?>

この例では、ヘッダー関数を使用して、フォーム データの処理後にユーザーを success.php ページにリダイレクトします。このページは送信が成功した後に表示されるページであり、フォームが含まれていないため、ブラウザの「戻る」ボタンやページのリロードを使用してフォームを再送信することはできません。

3. ブラウザーのキャッシュを無効にする

ブラウザーでフォームをキャッシュすると、フォームが繰り返し送信される可能性があります。ブラウザはサイトの Web ページをキャッシュできるため、ユーザーがブラウザの [戻る] ボタンをクリックするとフォームが再送信される場合があります。これを回避するには、ブラウザのキャッシュを無効にする必要があります。以下は、ブラウザのキャッシュを無効にする基本的な例です。

<?php
  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");         // Date in the past
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
  header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");                                // HTTP/1.0
?>

この例では、いくつかの HTTP ヘッダーを使用して、現在のページをキャッシュしないようブラウザに通知します。これには、過去の日付を表す「Expires」ヘッダーと、ページの処理方法に関するその他のいくつかのヘッダーが含まれます。

結論

PHP フォームを使用する場合、繰り返し送信を防ぐことが非常に重要です。上記の方法では、フォームの繰り返しの送信を回避し、データのセキュリティを保護するのに役立ついくつかの効果的なテクニックについて説明します。 PHP フォーム防御について詳しく知りたい場合は、PHP ドキュメントを確認するか、他の PHP 開発者のブログや記事を参照してください。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。