ホームページ >バックエンド開発 >PHPチュートリアル >phpでフォームの重複送信を防ぐ方法を詳しく解説

phpでフォームの重複送信を防ぐ方法を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-04-21 13:54:053485ブラウズ

ユーザーがフォームを送信すると、ネットワーク速度の関係で同じレコードがデータベースに繰り返し挿入されたり、Web ページが悪意を持って更新されたりする可能性があるため、無視できない制限は、ユーザーがフォームを繰り返し送信できないようにすることです。ユーザーが送信ボタンを押し続ける可能性や、攻撃者が悪意を持ってデータを送信した場合、データの変更やデータベースへのデータの追加など、データ送信後の処理で問題が発生する可能性があります。

では、フォームが繰り返し送信される現象を回避するにはどうすればよいでしょうか?フォームの繰り返し送信を防ぐために、PHP での一般的な方法をいくつかまとめてみましょう。

まず、フロントエンドから制限を加えます。

ボタンが 1 回クリックされるとフロントエンド JavaScript が無効になります。この方法は単純に送信ボタンの複数回のクリックを防止しますが、欠点は、ユーザーが JavaScript スクリプトを無効にすると機能しないことです。

以下の例で顧客について言及します。フォームの繰り返し送信の問題を処理するために使用します。以下のコードを参照してください:

<form method="post" name="register" action="test.PHP" enctype="multipart/form-data">
<input name="text" type="text" id="text" />
<input name="cont" value="提交" type="button" onClick="document.register.cont.value=&#39;正在提交,请等待...&#39;;document.register.cont.disabled=true;document.the_form.submit();">
</form>

ユーザーが「送信」ボタンをクリックすると、ボタンはグレーになり使用できなくなります

別のメソッドもありますが、これも JavaScript の関数を使用しますが、OnSubmit() メソッドを使用します。フォームが一度送信されると、すぐにダイアログ ボックスが表示されます。コードは次のとおりです。たとえば、ユーザーが「送信」ボタンをクリックした場合、スクリプトは現在のステータスを自動的に記録し、submitcount

変数

を 1 ずつ増やします。ユーザーが再度送信しようとすると、スクリプトは submitcount 変数の値がゼロ以外であると判断します。フォームが送信されたことをユーザーに通知するため、フォームを繰り返し送信する必要がなくなります。

2 番目に、Cookie 処理を使用します

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

<script language="javascript">
<!--
var submitcount=0;
function submitOnce (form){
if (submitcount == 0){
     submitcount++;
     return true;
} else{
    alert("正在操作,请不要重复提交,谢谢!");
    return false;
}
}
//-->
</script>
<form name="the_form" method="post" action="" onSubmit="return submitOnce(this)">
<input name="text" type="text" id="text" />
<input name="cont" value="提交" type="submit">
</form>

クライアントが Cookie を無効にしている場合。 , この方法は機能しません 効果がないことに注意してください。

3番目、セッション処理を使用します

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

<?php
if(isset($_POST[&#39;Go&#39;])){
    setcookie("tempcookie","",time()+30);
    header("Location:".$_SERVER[PHP_SELF]);
    exit();
}
if(isset($_COOKIE["tempcookie"])){
    setcookie("tempcookie","",0);
    echo "您已经提交过表单";
}
?>

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

<?php
    session_start();
    //根据当前SESSION生成随机数
    $code = mt_rand(0,1000000);
    $_SESSION[&#39;code&#39;] = $code;
?>

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

<input type="hidden" name="originator" value="<?=$code?>">

4番目、ヘッダー関数リダイレクトを使用します

上記の方法に加えて、より簡単な方法があります。つまり、ユーザーがフォームを送信すると、サーバー側でそれを処理します。コードは次のとおりです。

<?php
session_start();
if(isset($_POST[&#39;originator&#39;])) {
    if($_POST[&#39;originator&#39;] == $_SESSION[&#39;code&#39;]){
        // 处理该表单的语句,省略
    }else{
        echo ‘请不要刷新本页面或重复提交表单!’;
    }
}
?>

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

以上がphpでフォームの重複送信を防ぐ方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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