Как я могу запретить опытному пользователю вызывать мои функции ajax?


У меня есть сайт, который использует вызовы ajax для выполнения ряда функций. У них есть веб-браузер, который перезванивает сценарию - ajax.php . Хотя я использую данные post для передачи данных и ограничиваю команды, которые может вызывать сценарий ajax, на самом деле ничто не мешает пользователям подделывать вызовы ajax, пытаясь манипулировать сайтом. Есть ли какой-то общий способ предотвратить подмену звонков пользователями? Есть ли способ убедиться, что вызов ajax действительно исходит от моего веб-сайт, а не с какого-то другого скрипта или сайта?

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

 13
Author: Daniel Bingham, 2010-07-27

5 answers

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

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

 12
Author: , 2010-07-27 12:35:52

Короче говоря, нет. Любой запрос, отправленный по URL-адресу через GET или POST, может быть сделан любым пользователем с помощью любого программного обеспечения. На самом деле, запрос AJAX ничем не отличается от прямой загрузки URL-адреса, за исключением того, что в последнем случае возвращаемые данные отображаются в браузере как веб-страница.

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

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

Вероятно, лучшим решением будет ввести некоторую форму аутентификации.

 6
Author: DisgruntledGoat, 2010-07-27 15:52:52

Таким образом, вы в основном хотите ограничить ajax.php отвечать только на запросы AJAX?

Я не эксперт по php, но, похоже, можно определить, поступает ли данный запрос от AJAX или "обычного" запроса браузера, проверив значение $_SERVER['HTTP_X_REQUESTED_WITH'].

Источник

 3
Author: theycallmemorty, 2010-07-27 12:35:27

Как кто-то еще указал... вызовы ajax являются просто получателями $_GET или $_POST, поэтому мой подход всегда заключался в том, чтобы просто относиться к ним так, как я бы относился к любой странице действий, и фильтровать/очищать ввод. Если у вас есть небольшое отклонение от того, что вы ожидаете, например, в течение месяца, и вы знаете, что оно всегда в формате "Январь, февраль, март...", вы можете задать массив ожидаемых значений и отфильтровать его. Ловите все, что не соответствует, и, возможно, бросайте что-нибудь в ответ, например: "Бззт... спасибо за играя..."

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

НТХ

 1
Author: digit1001, 2010-11-18 18:27:36

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

Кроме того, может помочь привязка страницы, вызывающей ajax, к данным, возвращаемым ajax, ближе. Таким образом, на рассматриваемой странице при загрузке страницы отправьте ключ сеанса, который подходит для сеансов X, для каждого запроса ajax ваш JavaScript должен будет передать этот ключ обратно, или ajax вернет неудача. Как только ваша страница попадет на X+1 вызовы ajax, заставьте пользователя выполнить какое-либо действие (может быть, капчу? может быть, даже что-то вроде события mousemove или tap в зависимости от UA) перед отправкой нового ключа сеанса по проводу (вне диапазона от исходного ajax), затем перезапустите процесс.

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

 0
Author: artlung, 2010-07-27 16:46:41