Рецепти програмування на PHP або практичні поради з програмування → Захист сайту від атак або трохи про Міжсайтовий Скриптінг (XSS)
XSS - міжсайтовий скриптинг (Сross Site Sсriрting) - тип вразливості сата, використовується при хакерській атаці.
Специфіка подібних атак полягає в тому, що погані хлопчики використовують вразливий сайт як засіб атаки на клієнта. XSS-атака зазвичай проводиться шляхом конструювання спеціального URL. який атакуючий пред'являє своїй жертві, або вставки в форми спеціальних html-символів.
Зараз XSS складають близько 15% всіх виявлених вразливостей сайтів.
Якщо скрипти ніяк не захищати, то хакери зможуть багато. Наприклад, видалити або підмінити файли на вашому сервері, залізти в ваше базу даних і змінити дані, отримати паролі користувачів або використовувати ваш сайт для розсилки спаму. І багато іншого.
100% захисту не існує, але дам кілька практичних рекомендацій.
Захист від підстановки URL (метод $ _GET)
Все, що скрипт отримує в рядку URL треба перевіряти на допустимість.
Перш за все, необхідно налаштувати .htaccess - включити перевірку допустимих символів в рядку url. Якщо ваш сайт цілком обробляє один скрипт (index.php), то можна зробити так:
RewriteRule ^ ([A - z0 - 9 / _ -] *) $ index. php [L. QSA]
В цьому випадку в URL допускаються тільки латинські символи, символ "/" як роздільник каталогу, нижній прочерк і тире. Всі інші URL викличуть помилку і виконання скрипта буде перервано.
Якщо в рядку URL передбачається передача параметрів (що виглядає менш красиво і наочно), то треба додати в регулярний вираз. і (Не забуваючи екранувати ці символи).
Тепер займемося самим файлом index.php, який на початку отримує рядок URL.
$ Auri = explode ( "/". Strtolower ($ _SERVER [ 'REQUEST_URI']));
Після видалення двох перших елементів, які містили протокол і домен, перший елемент масиву тепер містить назву першого каталогу.
$ Anavi = array ( "news". "Pics". "Aboutme". "Contacts");
Тепер легко перевірити допустимість каталогу:
$ Dir = array_shift ($ auri);
if (! $ dir) echo "Ви потрапили на головну сторінку сайту";
elseif (in_array ($ dir. $ anavi)) echo "Ви потрапили в розділ $ dir";
else echo "Такої сторінки у нас немає";
Далі, якщо визначений наступний рівень каталогу, перевіряємо його коректність. Тут все залежить від структури посилань, яку ви задумали зробити у себе на сайті.
Якщо далі дожно бути передано число, то перевіряємо, що це ціле позитивне число.
$ Item = array_shift ($ auri);
if (! $ item) echo "Це список новин / картинок";
elseif ($ item (Int) $ item> 0) echo "Це новина / картинка №". (Int) $ item;
else echo "Такої сторінки у нас немає";
Захист від підстановки в форми і при запитах до БД
Давайте спробуємо написати простий клас, який займеться чищенням одержуваних від користувача значень.
function sanitize ($ val)