2012-02-13 4 views
1

Я строю веб-приложение контроллера модели для просмотра, и я хочу создать механизм спама запроса, почему? Позвольте мне вкратце объяснить:PHP запрос механизм предотвращения спама

Мы получили контроллер ajax, каждый пользовательский ввод получен через ajax, без прямого $ _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. 
    } 
} 

Таким образом, мы получили действие, чтобы оставить комментарий, мы только хотим, чтобы позволить пользователю размещать комментарий каждую секунду, поэтому мы применяем очень простой профилактический mecanisch в нашей сессии.

Отметьте в методе setPrevention. У меня есть 2 вопроса, мой первый вопрос, этот механизм - хорошая идея? Или есть альтернативные способы улучшения?

Второй вопрос: как проверить, был ли последний запрос в диапазоне интервалов? С microtime - microtime Я получаю разницу в секундах, но есть действия, когда я хочу применить интервал 500 мс.

То, что я получил до сих пор:

$_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(true) вместо microtime(), он вернет поплавок вместо строки. Используя float, вы сможете рассчитать количество миллисекунд, прошедших с момента первоначального запроса.

Обязательно используйте microtime для начала и окончания.

Что касается другого вопроса, это определенно один из способов ограничить количество запросов. Могут быть и другие способы, и этот вопрос не является тем, для чего был разработан Stack Overflow. Это субъективно.

+1

Я бы не согласился со вторым моментом, может быть лучший способ для этого конкретного случая. Ответ на вопрос для этого конкретного случая, а затем, возможно, использование обсуждения в более обобщенном случае, является довольно ядром для SO. – Chris

+0

@ Крис проверить мое редактирование. – randomKek

Смежные вопросы