ホームページ  >  記事  >  バックエンド開発  >  PHP での揺れ防止および重複送信のセキュリティ分析

PHP での揺れ防止および重複送信のセキュリティ分析

WBOY
WBOYオリジナル
2023-10-12 14:54:45777ブラウズ

PHP 中的防抖和防重复提交的安全性分析

PHP におけるアンチシェイクおよびアンチダブル送信のセキュリティ分析

はじめに:
Web サイトとアプリケーションの開発に伴い、Web フォームはその 1 つになりました。ユーザーインタラクションの重要な方法について説明します。ユーザーがフォームに記入して送信ボタンをクリックすると、サーバーは送信されたデータを受信して​​処理します。ただし、ネットワークの遅延やユーザーの誤操作により、フォームが複数回送信される場合があります。繰り返し送信すると、サーバーの負荷が増加するだけでなく、データの繰り返し挿入や不正な操作など、さまざまなセキュリティ上の問題が発生する可能性があります。これらの問題を解決するために、手ぶれ防止および重複投稿防止テクノロジーを使用できます。

1. アンチシェイクの原理と実装
アンチシェイクは、手動トリガーイベントを処理するための技術であり、その原理は、トリガーイベントの後に遅延時間を設定することです。イベントがトリガーされた場合にのみ、対応する操作が実行されます。遅延時間内にイベントが再度トリガーされると、タイマーが再起動され、遅延時間内にイベントが再度トリガーされない限り、操作は実行されません。

PHP では、JavaScript と AJAX を通じて手ぶれ補正機能を実装できます。まず、フロントエンド ページで JavaScript を使用してフォーム送信イベントをリッスンし、フォームのデフォルトの送信動作を防ぎます。次に、AJAX テクノロジを使用して、フォーム データをバックグラウンドの PHP プログラムに送信して処理します。 PHP プログラムでは、遅延時間を設定することで手ぶれ補正機能を実装することができ、遅延時間内に同じリクエストが再度受信されなかった場合にのみ、対応する動作が実行されます。

以下は具体的なサンプル コードです:

<script>
    var timer; // 定时器

    document.getElementById("submitBtn").addEventListener("click", function(event) {
        event.preventDefault(); // 阻止表单的默认提交行为
        
        clearTimeout(timer); // 清除之前的定时器
        
        timer = setTimeout(function() {
            // 发送 AJAX 请求
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "handle_form.php", true);
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    console.log(xhr.responseText);
                }
            };
            xhr.send(new FormData(document.getElementById("form")));
        }, 500); // 延迟时间设置为 500 毫秒
    });
</script>

この例では、setTimeout 関数を使用して、500 ミリ秒の遅延を持つタイマーを設定します。送信ボタンがクリックされるたびに、500 ミリ秒以内にもう一度送信ボタンをクリックすると、前のタイマーがクリアされ、500 ミリ秒の遅延でリセットされます。 AJAX リクエストは、遅延時間内に送信ボタンが再度クリックされなかった場合にのみ実行されます。

2. 重複投稿防止の原理と実装
重複投稿防止とは、各投稿リクエストが 1 回だけ実行されることを保証する技術であり、その原理は、最初の投稿後にマークを記録することです。リクエスト (トークンやタイムスタンプなど) を取得し、このトークンをユーザーのセッションに保存します。ユーザーが再度リクエストを送信するときは、まずこのマークがセッションに存在するかどうかを確認します。存在する場合はリクエストが送信されたことを意味し、2 回目の送信は直接拒否されます。存在しない場合は、リクエストが送信されたことを意味します。最初の送信では、対応する操作を実行し、このマークを会話に記録します。

PHP では、セッション ストレージとフォーム フィールド検証を通じて再送信防止機能を実装できます。まず、一意の識別子 (非表示フィールドまたはトークン) をフォームに追加し、リクエストが送信されるたびにこの一意の識別子をバックグラウンドに送信します。 PHP プログラムでは、まずこの一意の識別子がセッションに存在するかどうかを確認します。存在する場合は、リクエストが送信されたことを意味し、2 番目の送信は直接拒否されます。存在しない場合は、最初の送信であることを意味します送信すると、対応する操作が実行されてリクエストが送信され、一意の識別子がセッションにログインします。

以下は具体的なサンプル コードです:

<?php
session_start();

// 校验表单字段
if ($_POST["token"] != $_SESSION["token"]) {
    die("重复提交请求!");
}

// 处理表单提交
// ...

// 记录唯一标识符到会话中
$_SESSION["token"] = uniqid();
?>

この例では、まず session_start() 関数を通じてセッションを開き、フォーム フィールドを確認します $_POST["token"] がセッション内の識別子 $_SESSION["token"] と等しいかどうか。等しくない場合は、リクエストが繰り返し送信されたことを意味し、プログラムが直接終了してエラーメッセージが出力されます。値が等しい場合は、初めてリクエストが送信されたことを意味し、対応する操作が実行され、一意の識別子 uniqid() がセッションの途中に記録されます。

結論:
手振れ防止と反復送信防止により、Web フォームのセキュリティが確実に保証されます。手ぶれ防止および反復送信防止の技術的手段により、ユーザーの誤操作やネットワークの遅延によって引き起こされるフォームの反復送信の問題を効果的に回避できます。ただし、手ぶれ防止および重複送信防止は、一部のセキュリティ問題を解決するだけであり、データのセキュリティを完全に保証することはできません。したがって、実際の開発では、データ検証や権限制御など、他のセキュリティ対策を組み合わせてWebフォームのセキュリティを向上させる必要があります。

以上がPHP での揺れ防止および重複送信のセキュリティ分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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