ホームページ  >  記事  >  バックエンド開発  >  PHP はセッションと Cookie を使用して、繰り返しの送信を防止します。

PHP はセッションと Cookie を使用して、繰り返しの送信を防止します。

WBOY
WBOYオリジナル
2016-07-13 10:43:461002ブラウズ

繰り返しの送信を防ぐことは、Web 開発において実際的であり、フィルタリングのために同じデータを送信したかどうかを確認するためにデータベースに直接クエリすることに加えて、ユーザーがデータを送信するときにそのようなことを防ぐこともできることがわかりました。重複送信を防ぐために、セッションと Cookie に基づいたいくつかの実装方法を導入します。

更新または再送信を防止します

そこで、このような状況が起こらないようにパラメータを追加することを検討しました。COOKIE と SESSION は利用可能ですが、誰かが COOKIE を無効にしても、悪意を持ってクリック数を更新する可能性があります。 SESSION を使用することをお勧めします。IP+URL パラメータの MD5 値が SESSION 名として使用されます
実装原理 Set max_reloadtime =100 //最大ページ更新間隔を設定します
; ユーザーが初めてページを開いたときに、現在の時間が記録され、session_start に保存されます
ユーザーが 2 回目にページを開いたとき (session_start が存在するかどうかを判断するため)、session_start から現在時刻を減算して、差分 time_passed を取得します
time_passed

コードは次のとおりです コードをコピー

セッション開始(); $k = $_GET['k']
$t = $_GET['t']; //アンチリフレッシュタイム
$allowTime = 1800; $ip = get_client_ip(); $allowT = md5($ip . $k . $t); If (!isset($_SESSION[$allowT])) {
$refresh = true; $_SESSION[$allowT] = 時間(); elseif (time() - $_SESSION[$allowT] > $allowTime) {
$refresh = true; $_SESSION[$allowT] = 時間(); } その他 {
$refresh = false; }
?>




フォームの繰り返し送信を防止します

コードは次のとおりです コードをコピー

/* 改良版
PHP では、ユーザーがページを更新 (更新または再読み込み) したり、フォームのコンテンツを繰り返し送信したりすることができなくなります。
フォーム変数の内容は $_POST['name'] によって参照されるため、おそらくフォームを処理した後、$_POST['name'] を直接破棄することができます (unset())。実際には違います。ページがデフォルトでフォームのコンテンツをキャッシュしている可能性があります。そのため、$_POST['name'] が破棄された場合でも、$_POST['name'] には更新後に値が割り当てられ、依然として有効です。
セッションを使用して解決できます。まず、セッションに 400 などの値を割り当てます。最初の送信が成功した後、2 回目の送信時にセッションの値を変更します。セッションの値が 400 でない場合は、セッション内のデータを確認します。フォームは処理されなくなります。
セッションの有効期限は設定できますか?
*/
If (isset($_POST['action']) && $_POST['action'] == '送信済み') {
セッション開始(); isset($_SESSION['num']) または die ("セッションなし"); If ($_SESSION['num']==400){
「& lt; 前 & gt;」を印刷します。 print_r($ _ post); '& lt; a href =" '. $ _Server [' PHP_SELF '].' "& GT;/A & GT; 「& lt;/pre & gt;」を印刷します。 $_SESSION['num']=500;                                                                                                            「& lt; 前 & gt;」を印刷します。 print_r($ _ post); echo "ただし送信しました"; 「</pre>」を印刷します。                                                                          } それ以外 { session_start() または die("セッションが開始されていません");
$_SESSION['num']= 400; ?>
<フォームアクション="" メソッド="POST"> 名前:
メール:
ビール:
<名前="ビール[]"を複数選択>                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                              ?>






例、smarty に基づくデモ版

コードは次のとおりです
コードをコピー

$code = mt_rand(0,1000000); setcookie('addtips',$code,time()+300); if(isset($_POST['submit']) ){ } $smarty->assign('code',$code);コードをコピー
if($_COOKIE['addtips']!= $_POST['code']){ echo "このページを更新したり、フォームを繰り返し送信しないでください。"; 終了(); }



10./////フォームの繰り返し送信を防止する

tplテンプレート内




コードは次のとおりです

1.

/*PHP のセッション関数を使用すると、PHP フォームの繰り返しの送信を避けることもできます。セッションはサーバー側に保存され、次回この変数にアクセスすると、セッション変数を使用して送信された値を記録できます。フォームに一致しない場合は、繰り返し送信しているユーザーとみなされます */ Session_start();//現在のセッションに基づいて乱数を生成します < input type="hidden" name="originator" value="< ?=$code?>">

//受信ページのコードは次のとおりです: http://www.bkjia.com/PHPjc/633153.html
$code = mt_rand(0,1000000); $_SESSION['コード'] = $コード; //フォーム内のパスを非表示にする:

セッション開始(); if(isset($_POST['originator'])) {

if($_POST['発信者'] ==
$_SESSION['コード']){

// フォームを処理するステートメント、省略

}その他{
echo 'このページを更新しないでください。または
もう一度フォームを送信してください。 』;
}
}







http://www.bkjia.com/PHPjc/633153.html

www.bkjia.com

tru​​e

技術記事繰り返しの送信を防ぐことは、Web 開発において現実的でよく発生する問題であることに加えて、データベースに直接クエリを実行して、ユーザーが同じデータを送信したかどうかをフィルタリングすることもできます...

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