2012-02-13 10 views
1

私はモデルビューコントローラWebアプリケーションを構築していますが、リクエストスパムメカニズムを構築したいのですが、なぜですか?PHPリクエストスパム防止メカニズム

私たちはajaxコントローラを手に入れました。すべてのユーザー入力はajaxを通じて受信されます。私のWebアプリケーションで直接$ _POSTは実行されません。

のは、我々は上のスパム防止機構を配置するAjaxのコントローラのいくつかのアクションを想像してみましょう:

class AjaxController{ 
    private function setPrevention($interval){ 
     $latestActionRequest = $_SESSION['requests'][$this->action]; 

     if($prevention === null){ 
      $_SESSION['requests'][$this->action] = array('latest' => microtime(), 'interval' => $interval 
     } else { 
      // Calc difference here, and check if the interval was within range, else 
      // the user was requesting the action method to quickly. 
     } 
    } 

    public function _postComment(){ 
     $this->setPrevention(1000); 

     // Apply validation, on the $_POST array, insert the to database. 
    } 
} 

だから我々は、コメントを投稿するアクションを持って、我々は唯一のユーザーが投稿できるようにしたいです毎秒コメントがありますので、セッションでは非常に基本的な予防策を適用しています。

setPreventionメソッドのコメントを確認してください。私は2つの質問がある、私の最初の質問は、このメカニズムは良いアイデアですか?または、これを構築するための代替方法がありますか?

2番目の質問は、最新のリクエストがインターバルの範囲内にあったかどうかを確認する方法です。 microtime - microtimeでは秒差がありますが、500ms間隔を適用するアクションがあります。ある

$_SESSION['requests']['postComment'] = array('latest' => microtime(true), 'interval' => 1000); 
$difference = ($_SESSION['requests']['postComment'] - microtime(true)); 

この時点で$差がフロートをバック与えます(106.984388113)(106秒を待っていた) しかし、私たちの間隔が1000であるので、我々は、微小時間差を取得したい(:私は今のところ得たもの

1秒ではなく1000秒)

私の質問がはっきりしたことを願っています。

+0

あなたの編集に対する私の答えを改訂しました。 – Chris

答えて

1

最初の回答は、補助的なタイミングで役立ちます。 microtime(true)

の編集に応じて:小数点以下は小秒のタイミングです。 .984は精度の面で探している部分です。 .500は500ミリ秒です。私は、この浮動小数点値の観点からあなたの間隔を設定することをお勧めします。

差を1000倍にすることはできますが、ミリ秒より大きいか短い精度に調整する場合は、さらに混乱することになります。そして、できるだけ後でこれを調整するのが簡単だと提案します。

スパム防止のメカニズムについては、多くのオプションがありますが、アプリケーションに必要なものの詳細に依存します。

私があなたに与えることができる最善のアドバイスは、あなたが今必要と思われるよりもAJAX呼び出しについてのより多くの情報を得ることができる何らかの方法で抽象化して、今動作する単純なシステムを構築し、レビューのリクエスト

スパム防止の最大の問題は、正当なユーザーを妨害して迷惑をかけることです。だからあなたができる最善のことは、あなた自身や他の開発者があなたの将来のメカニズムを簡単に交換できるようにすることです。また、スパム防止によってどの種類の要求が停止しているかどうかを判断できるようにする要求のログが必要です。

+0

@MikeVercoelen問題はありませんが、これはユーザビリティへの影響を制限するために検討し修正するものでなければならないことを忘れないでください – Chris

1

microtime()の代わりにmicrotime(true)を使用すると、文字列ではなく浮動小数点数が返されます。フロートを使用すると、元のリクエストから経過したミリ秒数を計算できます。

開始時刻と終了時刻の両方に必ずmicrotimeを使用してください。

他の質問については、これは間違いなく要求の数を制限できる1つの方法です。他の方法もあるかもしれません。その質問は実際にStack Overflowが設計されたものではありません。主観的です。

+1

私は2番目の点に同意しないでしょう、この特定の場合には最良の方法があるかもしれません。この特定のケースの質問に答えて、より一般化されたケースでディスカッションを使用することは、SOの核心です。 – Chris

+0

@Chrisは自分の編集をチェックします。 – randomKek