Home »сайтостроітеля» Захист PHP скриптів, що викликаються AJAX
До написання даного поста мене спонукав однотипний питання, що задається на безлічі вебмастерскіх форумів - в тому числі і на нулледе, який я модерується і вважаю найкращим з них. Якщо файл, який ми просто інклюд можна "сховати" додаванням будь-якої константи - defined ( '_ BLABLABLA') or die () то з файлами, що викликаються XMLHttpRequest ситуація трохи інша.
Отже, спочатку "простий" приклад:
Найперше (і найпростіше) - перевірити як викликається файл:
Проте, не можна назвати даний спосіб універсальним - наприклад відвідувач прийшов через корпоративний проксі, ріжучий "незнайомі" заголовки. До того ж заголовки можна підробити.
Наступне - це додати перевірку реферера, тобто звідки викликається файл. Трохи змінимо виклик файлу:
а в myfile.php робимо приблизно так:
Однак і шлях і домен можна підробити, тобто так само як і в першому випадку, вважати це універсальної захистом принаймні наївно. Що можна перевірити ще?
Можна в зухвалій файлі додати сесію, а в визиваевом перевіряти її відповідність.
Для цього додамо в викликає файл рядки:
А в myfile.php додамо таку перевірку:
У прикладах спеціально не вказано жодних дій у разі "неправильного" звернення до файлу - як поступати, ви повинні вирішувати самі в кожному конкретному випадку - переривати роботу скрипта, видавати повідомлення про помилку, писати в лог і т.д.
Якщо використовувати всі три перевірки одночасно, то будете мати досить високу ступінь захисту від виклику файлу "ззовні". Однак не варто покладатися лише на ці перевірки. Якщо файл, що викликається, наприклад, записує дані в базу, ці дані також потребують перевірки. Якщо файл, що викликається завантажує щось (наприклад картинку або архів) на сервер - обов'язково потрібно перевіряти це "щось". Тобто не забувайте про найголовніше правило - все що приходить ззовні потенційно небезпечно.
Якщо даний пост здався вам корисним або цікавим, натисніть на одну з кнопок нижче - від vkontakte, facebook, tweeter або google +, щоб про нього дізналися ваші друзі. Дякуємо!