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

12

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

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

Дэниел Бингхэм
источник
Вызовы ajax полностью не аутентифицированы? Вы создаете сессии для каждого? Есть ли закономерности злоупотребления? И это проблема конкретных манипуляций или больше нагрузки, которую она добавляет на сайт?
artlung
Можете ли вы опубликовать более подробную информацию, пожалуйста? Что делают вызовы AJAX? Чем они манипулируют? Какие проблемы возникают, если скрипт вызывается вне AJAX?
Рассерженная шлюха
Я на самом деле не спрашиваю о конкретных обстоятельствах, а скорее об общем решении, применимом ко многим обстоятельствам. Если есть такое решение, которое, кажется, не существует.
Даниэль Бингхэм

Ответы:

12

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

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


источник
2
+1 ... так же, как невозможно удержать людей от сохранения локальных копий всего, что отображается в их браузере. Это скорее соревнование, чтобы увидеть, сможете ли вы заставить их сдаться и перейти к чему-то еще, прежде чем они это поймут.
Тим Пост
6

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

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

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

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

DisgruntledGoat
источник
3

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

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

Источник

theycallmemorty
источник
2
Хорошая мысль, если предположить, что обидчик не использует ajax и не подделывает этот HTTP-заголовок
Адам,
1

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

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

НТН

digit1001
источник
+1 за "Bzzt" - что становится намного смешнее в контексте "Bzzt - спасибо за игру!" сопровождаемое медленным переходом к черному цвету, сопровождаемому трехчасовым запретом, установленным cookie-файлом, установленным на компьютере пользователя (я уверен, что они получат сообщение)
danlefree
0

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

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

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

artlung
источник