Захист сайту від атак або трохи про Міжсайтовий Скриптінг (xss)

Рецепти програмування на 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)