3

私はphpプログラムに基づいたいくつかのケースがあります。検索ニーズに対応する検索入力フォームを実装しました。検索要求を処理するコントローラーがあります。POSTまたはGETのどちらのリクエストのアクションでも、短い時間間隔でリクエストを繰り返すことができる穴が発生する可能性があることに気づきました。私が考えているのは、最後のリクエストをチェックして、現在のリクエストと比較することです。間隔が禁止された時間範囲と一致した場合(約0〜500ミリ秒であると言われます)、コントローラーは要求が時間範囲を通過するまで検索を行いません。

リクエストをテーブルに保存することを考えています。キーはリクエスターreal_IPにあります。次に、それを新しいリクエスト(CMIIW)と比較します。

これを適切に取得するための良いアプローチはありますか?

4

3 に答える 3

2

このソリューションでは、代わりに $_SESSION を使用します。

session_start();

$now = microtime(true); 
$interval = $now - 2;

if( 
  isset( $_SESSION['last_request'] ) 
  && ($_SESSION['last_request'] >= $interval) 
){   
  exit('timeout'); 
}

$_SESSION['last_request'] = $now;

//do query
于 2012-06-27T07:13:35.327 に答える
2

IP を使用して検索数を制限すると、あらゆる機関 (例: 学校) がサービス/ウェブサイト/検索を使用できなくなります。セッションを使用すると、使用がブラウザー セッションに制限されます。ブラウザーを閉じると、セッション変数が削除されるため、新しいユーザーがアプリケーションを使用できるようになります。

より良い方法は、セッション変数に最後の検索時間を(提案したように)設定し、その変数が存在しないか、または検索要求を満たすために 500 ミリ秒より前であることを確認することです。

セッション変数を設定する$_SESSION['lastsearchtime']には、セッションがロードされた後に使用できますsession_start()。session_start が既に呼び出されている場合、エラーが発生する可能性があることに注意してください。

于 2012-06-27T07:07:00.767 に答える
1

ここにはいくつかのオプションがあります。

  1. ワンタイム トークンを実装します (wordpress ではnonceと呼ばれます)。そして、すべてのリクエストで、あなたはそれをチェックします。トークンが既に使用されていて、(後続の要求によって) 再度使用される場合は、その要求を拒否します)。

  2. セッション変数に最後のリクエスト時間を実装し、時間枠内にある場合は後のリクエストをチェックし、そのリクエストを拒否します。これについては、 Max Gherkinsの回答を確認できます。

于 2012-06-27T07:16:01.683 に答える