ホームページ  >  記事  >  バックエンド開発  >  繰り返しの送信を防ぐ PHP に関連する問題の概要

繰り返しの送信を防ぐ PHP に関連する問題の概要

WBOY
WBOYオリジナル
2016-06-13 12:52:30794ブラウズ

PHP による繰り返し送信の問題の防止の概要
ユーザーがフォームを送信すると、ネットワーク速度の関係で同じレコードがデータベースに繰り返し挿入される可能性があるか、Web ページが悪意を持って更新される可能性があります。これは比較的厄介な問題です。同じフォームを繰り返し送信することを避けるために、クライアント側とサーバー側から同時に開始することができます。

1.クライアントスクリプトを使用する
クライアント側スクリプトに関しては、一般的な入力検証に JavaScript がよく使用されます。次の例では、フォームの繰り返し送信を処理するためにこれを使用しています。次のコードを参照してください:







ユーザーが「送信」ボタンをクリックすると、図 5-6 に示すように、ボタンが灰色になり使用できなくなります。

上の例では、OnClick イベントを使用してユーザーの送信ステータスを検出します。「送信」ボタンがクリックされると、ボタンはすぐに非アクティブになり、ユーザーはボタンを再度クリックして送信できなくなります。

別の方法もありますが、これも JavaScript の関数を使用しますが、OnSubmit() メソッドを使用します。コードは次のとおりです。
<スクリプト言語="javascript">




<フォーム名="the_form" メソッド="post" action="" onSubmit="return submitOnce(this)">




上の例では、ユーザーが「送信」ボタンをクリックすると、スクリプトは現在のステータスを自動的に記録し、submitcount 変数を 1 ずつ増分します。ユーザーが再度送信しようとすると、スクリプトは submitcount 変数の値が正しくないと判断します。 -zero は、フォームの 2 回の送信を避けるために、submitcount 変数が Submit であることをユーザーに通知します。

2. Cookie を使用する
Cookie を使用してフォームの送信ステータスを記録し、そのステータスに基づいてフォームが送信されたかどうかを確認できます。


if(isset($_POST['go'])){

setcookie("tempcookie","",time()+30);
header("場所:".$_SERVER[PHP_SELF]);
終了();
}

if(isset($_COOKIE["tempcookie"])){

setcookie("tempcookie","",0);
echo "フォームはすでに送信されています";
}

?>

クライアントが Cookie を無効にしている場合、このメソッドは効果がないことに注意してください。 Cookie の詳細については、第 10 章「PHP セッション管理」を参照してください。

3.セッション処理を使用する
PHP のセッション関数を使用すると、フォームの繰り返しの送信を回避することもできます。セッションはサーバー側に保存され、次回この変数にアクセスすると、セッション変数を使用して送信された値を記録できます。フォームが一致しない場合は、ユーザーが繰り返し送信していると見なされます。次のコードを参照してください:


セッション開始();

// 現在の SESSION に基づいて乱数を生成します

$code = mt_rand(0,1000000);
$_SESSION['コード'] = $コード

?>

ページフォームの隠し値として乱数を渡します。コードは次のとおりです:


受信ページの PHP コードは次のとおりです:


セッション開始();

if(isset($_POST['originator'])) {

If($_POST['originator'] == $_SESSION['code']){

// フォームを処理するステートメント。
は省略します。
}その他{

echo 'このページを更新したり、フォームを繰り返し送信しないでください。 ';

}

}

?>

Session の内容については、第 10 章「PHP セッション管理」で詳しく説明します。この章を直接確認してから、このセクションに戻って読み続けることができます。

4.ヘッダー関数を使用して
をリダイレクトします 上記の方法に加えて、より簡単な方法もあります。つまり、ユーザーがフォームを送信すると、サーバー側でそれを処理し、すぐに他のページにリダイレクトされます。コードは次のとおりです。

if (isset($_POST['action']) && $_POST['action'] == '送信済み') {

// データの挿入後などにデータを処理し、すぐに他のページにリダイレクトします

header('location:submits_success.php');
}

この方法では、ユーザーが更新キーを使用した場合でも、フォームは新しいページにリダイレクトされ、このページ スクリプトは送信されたデータを気にしなくなるため、フォームが繰り返し送信されることはありません。

5.8.4 フォームの有効期限切れの処理
開発プロセス中に、フォーム エラーが発生し、ページに戻ったときに入力されたすべての情報が失われることがよくあります。ページ バウンスをサポートするには、次の 2 つの方法を使用できます。

1.ヘッダー ヘッダーを使用して、キャッシュ コントロール ヘッダー Cache-control を設定します。

header('Cache-control: private, must-revalidate'); // ページのバウンスをサポート

2. session_cache_limiter メソッドを使用します。

session_cache_limiter('private,must-revalidate'); //session_start メソッドの前に記述されます

次のコード スニペットにより、ユーザーがフォームに入力して [送信] ボタンをクリックして戻ることができなくなり、フォームに入力したばかりのコンテンツはクリアされません:

session_cache_limiter('nocache');

session_cache_limiter('プライベート');
session_cache_limiter('パブリック');
セッション開始();

//以下はフォームの内容です。ユーザーがフォームに戻っても、入力した内容はクリアされません

このコードを適用したいスクリプトの先頭に貼り付けるだけです。

Cache-Control メッセージ ヘッダー フィールドの説明
Cache-Control は、リクエストとレスポンスが従うキャッシュ メカニズムを指定します。要求メッセージまたは応答メッセージで Cache-Control を設定しても、別のメッセージの処理中のキャッシュ プロセスは変更されません。

リクエスト内のキャッシュ命令には、no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached が含まれます。応答メッセージ内の命令には、public、private、no-cache、no- が含まれます。ストア、変換なし、必須再検証、プロキシ再検証、および最大経過時間。各メッセージの指示の意味を表 5-3 に示します。


ディレクティブのキャッシュ
セイミン

公開
応答を任意のキャッシュにキャッシュできることを示します

プライベート
単一ユーザーの応答メッセージの全部または一部を共有キャッシュで処理できないことを示します。これにより、サーバーはユーザーの応答メッセージの一部のみを記述することができ、他のユーザーのリクエストには無効になります

キャッシュなし
リクエストまたはレスポンスメッセージをキャッシュできないことを示します

無店舗
重要な情報が意図せず公開されることを防ぐために使用されます。リクエスト メッセージを送信すると、リクエスト メッセージとレスポンス メッセージの両方でキャッシュが使用されなくなります

最大年齢
クライアントが指定された秒数以下の有効期間で応答を受信できることを示します

最小新鮮
クライアントが、現在の時刻に指定された時刻を加算した値よりも短い応答時間で応答を受信できることを示します

最大古い
クライアントがタイムアウト期間を超えて応答メッセージを受信できることを示します。max-stale message の値が指定されている場合、クライアントはタイムアウト期間の指定値を超える応答メッセージを受信できます

セッションと Cookie の概要については、第 10 章「PHP セッション管理」を参照してください。

5.8.5 フォームアクションを判断するためのテクニック
フォームには、同じプログラムで処理すべきアクションを割り当てることができます。ユーザーが押したボタンの内容をどのように判断するかは、小さな問題です。

実際には、フォームが送信されるときに、送信ボタンの名前がわかれば、ボタンの値が判断される限り、押された送信タイプのボタンのみがフォーム配列に送信されます。例として、次の形式を取ると、ユーザーがどのボタンを押したかを知ることができます。





ユーザーが「a」ボタンを押すと btn=a、「b」ボタンを押すと btn=b となります。

また、送信ボタンの名前でも判断できます。次のコードを参照してください:






このように、POST/GETパラメータにaかbがあれば、どのボタンが押されたのかが分かります。


Print_r($_POST);
?>



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