Как мне защитить от ajax-спама в PHP? - PullRequest
5 голосов
/ 04 марта 2011

Добрый день,

Хотелось бы узнать, как защитить свой сайт от ajax-спама.Я пытаюсь ограничить любые действия ajax для пользователей.Допустим, 8 ajax-действий в минуту.

Примером действия может быть: кнопка для добавления / удаления сообщений в блоге «как избранные».

Если я не ошибаюсь,Я считаю, что лучшим способом было бы использовать переменную $_SESSION и не позволять кому-либо / боту очищать куки, чтобы избежать моей защиты.Я разрешаю ajax-функции только зарегистрированным пользователям.

Использование базы данных сделает мою защиту бесполезной, потому что я пытаюсь избегать записи нежелательной базы данных.

Я должен упомянутьчто я на самом деле использую PHP в качестве серверного языка и jQuery для обработки моих вызовов ajax.

Спасибо

Редактировать:

Предложение

... для защиты моего сайта ...

сбивает с толку, но речь не идет о междоменном ajax.

Редактировать 2011-04-20: Я добавил к нему награду в 50.

Ответы [ 8 ]

9 голосов
/ 24 апреля 2011

Поскольку вы разрешаете только действия AJAX для зарегистрированных пользователей, это действительно легко решить.

  • Создайте поле метки времени для каждой учетной записи.Вы можете сделать это в базе данных, или использовать Memcached, или альтернативно использовать плоский файл.
  • Каждый раз, когда пользователь делает запрос через ваш интерфейс AJAX, добавляйте текущую метку времени в свои записи и:
  • Убедитесь, что последние восемь временных отметок не все до одной минуты назад.

Оттуда вы можете добавить дополнительную магию, например, временные аккаунты, которые грубо нарушаютограничение скорости или сравнение IP-адресов нарушителей с черными списками известных спаммеров и т. д.

1 голос
/ 24 апреля 2011

Вы говорите о конкретном ajax-спаме на вашем сайте или о ajax-spam в целом?

Если последнее, вы можете использовать хеши, чтобы предотвратить автоматическую отправку форм, то есть написать свой hash() один-way функция, которая берет строку и делает из нее sha1-контрольную сумму.

Вот как вы ее используете:

// the page is a blog post #357
$id = 357;
$type = 'post';
$hash = hash($_SERVER['REMOTE_ADDR'].$type.$id);

Поместите этот хеш в скрытое поле, которое не внутри формы комментария или даже скрытого div, где-то внизу страницы, и назовите его «control_hash» или что-то в этом роде.Прикрепите это значение к ajax-запросу при отправке формы.Когда форма получена сценарием, создайте новый хэш из данных $_REQUEST (исключая существующие $control_hash) и проверьте, совпадают ли они.

Если форма была отправлена ​​ботом, она не будет иметь$control_hash, так что не пройдет.

0 голосов
/ 27 апреля 2011

да, вам нужно использовать функцию в каждой функции, с которой могут взаимодействовать представления, также она должна быть в глобальной библиотеке, чтобы вы могли использовать ее где угодно.

if(is_logged_in())
{
    // do you code here 
}

в то время как is_logged in определяется следующим образом

function is_logged_in($activated = TRUE)
{
    return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED);
}

Вы должны установить статус сеанса при успешной авторизации пользователя.

0 голосов
/ 27 апреля 2011

Вы можете использовать поле сеанса с глобальной переменной, содержащей время последнего запроса AJAX.Поскольку вы хотите разрешить 8 запросов, сделайте его размером 8 и проверьте разницу во времени.Если это увеличивается, (важно), это не всегда может быть бот.дать пользователю шанс с капчей или чем-то подобным(может быть, математическая проблема?)

после проверки капчи, разрешите следующие несколько сообщений и т. д.

Но убедитесь, что вы проверяете этот конкретный сеанс и пользователя.

Ответ Керин хорош, я просто хотел подчеркнуть капчу.

0 голосов
/ 27 апреля 2011

Купите более мощный хостинг, чтобы иметь возможность обслуживать запросы, не ограничивая их. 8 запросов в минуту, это смешно.
В любом случае, если запросы являются «законными», вы должны найти способы, как обслуживать запросы, а не как их ограничивать. А если не «законно» - откажитесь от них без каких-либо «временных» ограничений.

0 голосов
/ 27 апреля 2011

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

Оправдывает ли цель средства?

Вы также должнысудите, какова вероятность такого спама.Большинство ботов не очень умны и с треском провалится, когда будет какое-то логирование.

Только мои 2 цента, остальные ответы совершенно верны, чтобы избежать спама.

0 голосов
/ 26 апреля 2011

Если у вас есть доступ к исходному коду веб-сайта, вы можете переписать часть кода javascript, который фактически выполняет AJAX-запрос. То есть Ваши страницы могут иметь скрытое поле счетчика, которое увеличивается каждый раз, когда пользователь нажимает кнопку. А также вы можете скрыть временное поле на странице, чтобы оценить частоту кликов.

Идея в том, что вам даже не нужно ничего отправлять на сервер - просто проверьте это на стороне клиента внутри скрипта. Конечно, это не поможет против ботов, обращающихся напрямую к серверу.

0 голосов
/ 04 марта 2011

Да, ваша идея в принципе хороша. Некоторые вещи, чтобы рассмотреть, хотя:

  • Если вы отслеживаете ограничения в глобальном масштабе, то вы можете столкнуться с проблемой бота DoS на вашем сервере и лишением законных пользователей возможности использовать вашу кнопку "Избранное".
  • Если вы отслеживаете запросы на основе своего IP-адреса, тогда кто-то может использовать бот-сеть (несколько IP-адресов), чтобы обойти вашу блокировку. В зависимости от вашего сайта и ваших предпочтений, возможно, ограничение на основе подсети IP .
  • Установите и используйте Memcache для хранения и отслеживания запросов, особенно если вы собираетесь отслеживать по IP. Это должно быть быстрее, чем использование переменных сеанса (кто-то может исправить меня).
...