Як я можу запобігти користувачеві живлення викликати свої функції ajax?


12

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

Або мені просто потрібно перевірити граничні умови в скрипті php і не дозволяти користувачам підробляти речі, які їм би не дозволяли робити, але дозволяти їм підробляти місця, де вони будуть дозволені.


Чи дзвінки Ajax повністю не підтверджені? Чи створюєте ви сеанси для кожного? Чи існують зразки зловживань? І проблема полягає в конкретних маніпуляціях чи більше кількості завантаження, яке вона додає на сайт?
artlung

Чи можете ви опублікувати більше деталей, будь ласка? Що роблять дзвінки AJAX? Що вони маніпулюють? Які проблеми виникають, якщо скрипт викликається поза AJAX?
НезадоволенняЗалейте

Я насправді не питаю про конкретну обставину, а радше про загальне рішення, застосовне до багатьох обставин. Якщо є таке рішення, яке, схоже, не існує.
Даніель Бінгем

Відповіді:


12

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

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


2
+1 .. так само, як неможливо уберегти людей від збереження локальних копій всього, що відображається у їхньому браузері. Це більше змагання, щоб побачити, чи можете ви змусити їх відмовитись і перейти до чогось іншого, перш ніж вони це зрозуміють.
Tim Post

6

Словом, ні. Будь-який запит, направлений до URL через GET або POST, може надіслати кожен, хто використовує будь-яке програмне забезпечення. Насправді, запит AJAX насправді не відрізняється від завантаження URL-адреси безпосередньо, за винятком останнього, коли повернуті дані відображаються в браузері, як веб-сторінка.

Саме ця причина завжди повинна перевіряти подані дані на сервері, незалежно від того, чи проводите ви перевірку Javascript.

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

Напевно, найкращим рішенням буде запровадити певну форму аутентифікації.


3

Отже, ви в основному хочете обмежити ajax.php лише відповідати на запити AJAX?

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

Джерело


2
хороший момент, якщо припустити, що зловмисник не використовує ajax або підробляти цей HTTP-заголовок
Адам

1

Як хтось інший зазначив ... Ajax дзвінки - це лише приймачі $ _GET або $ _POST, тому мій підхід завжди полягав у тому, щоб просто ставитись до них, як я б до будь-якої сторінки дій, і фільтрувати / санітувати вхід. Якщо у вас є невелика варіація того, що ви очікуєте, наприклад, місяць, і ви знаєте, що це завжди у форматі "січень, лютий, березень ...", ви можете встановити масив очікуваних значень і відфільтрувати його. Половіть все, що не відповідає, і необов’язково відкиньте щось на кшталт "Bzzt ... спасибі за гру ..."

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

HTH


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

0

Я думаю, що основним елементом вашого рішення стане обмеження швидкості руху від конкретного відбитка користувача. Можливо хеш-адреса IP-адреси, рядок User Agent та дані, що надсилаються.

Також прив'язка сторінки, яка викликає ajax до повернених даних ajax, може допомогти. Отже, на відповідній сторінці при завантаженні сторінки надсилайте ключ сесії, який підходить для Xсеансів, для кожного запиту ajax ваш JavaScript повинен буде передати цей ключ назад, або Ajax поверне помилку. Як тільки ваша сторінка потрапляє на X+1дзвінки Ajax, змушуйте користувача зробити якісь дії (можливо, captcha? Можливо навіть щось на кшталт mousemoveабо tapподія залежно від UA), перш ніж надсилати новий сеансовий ключ по проводу (поза діапазоном від початкового ajax), після чого перезавантажте процес.

Хоча я думаю про це, можливо, можливо, частиною вашої проблеми є слабке підтвердження відправлених параметрів. Якщо люди можуть просто пограти з надісланими параметрами та отримати дійсні дані, тоді це зробити складніше. Як це зробити, залежить від того, які цінності надсилає клієнт, і які помилки може зробити поганий актор, надсилаючи погані цінності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.