2017-12-05 7 views
0

私は、ajaxを介してphp関数を呼び出すボタンをユーザがクリックする非常に単純なゲームを持っています。 php関数は呼び出しを記録し、ボタンをクリックする機能を1減らします。迅速なajax呼び出しからの保護

ユーザーがボタンを叩くか強制的にphp関数を呼び出すと、ユーザーは1分間で何百回もphp関数を実行できます。

これを停止する方法はありますか?

単純なサーバ側コールごと1500msを制限するためのコード、またはしないことが判明として:)

$user = Utils::getUser(); 
$now = round(microtime(true) * 1000); 
// run spin 
if($user){ 
    $dif = $now - $user->last_spin; 
    if($user->spins > 0 && $dif > 1500){ 
     $user->last_spin = $now; 
     $user->decrement('spins'); 
     $user->increment('spin_count'); 
     $user->save(); 

     //do stuff 
    } 
} 
+1

ボタンを1回クリックすると無効になりますか? – GrumpyCrouton

+3

ユーザーのリクエストを停止することはできません。しかし、サーバーサイドのコードでは、何か起きていることを追跡し、ビジネスロジックの要件を満たしていない場合はエラーを返すことができます。または、アーキテクチャレベルでは、アプリケーションに到達する前にWebサーバーやルータでもリクエストを抑制することができます。それは別のスタックエクスチェンジサイトに適していますが。 – David

+0

ボタンが無効になります。しかし、ボタンが無効になる前に、ユーザーは依然としてajaxコールを迷惑メールにすることができます。 jsでボタンを無効にすることは、ユーザーが簡単に元に戻すことができます。 – xtremetom

答えて

0

各要求には、セッション中に微小時間を格納し、PHPコードを実行する前に、そのセッションを確認してください。

if(!isset($_SESSION)) session_start(); 
if(!isset($_SESSION['ajax_call']) || $_SERVER['REQUEST_TIME_FLOAT'] >($_SESSION['ajax_call']+1.5)){ 
    //ok, your code to run 
} 
$_SESSION['ajax_call'] = $_SERVER['REQUEST_TIME_FLOAT']; 
関連する問題