XSS-ін’єкція

В даній статті розглянемо методи захисту від такого типу вразливості Веб-додатків як XSS ін’єкція. Що ж таке XSS ін’єкція?

XSS - (англ. Сross Site Sсriрting) - міжсайтовий скриптинг, тип вразливості комп’ютерної системи. Особливістю даного типу атак є те, що замість безпосередньої атаки сервера, використовується вразливий сервер в якості засобу для атаки на клієнта.

Cross-site scripting - це одна з найбільш поширених вразливості Веб-додатків. При такому типу атаки, атакуючий розміщує шкідливий JavaScript або інший вміст на Веб-сторінці (наприклад повідомлення на форумі), який пізніше може бути виконаний цим Веб-додатком. Тут ми говоримо про скрипти, які можуть бути вставлені в HTML-код, і потім виконані браузером користувача.
Розрізняють п’ять найбільш поширених таких скриптів:

  • <script>: часто використовується для вставки JavaScript або VBScript;
  • <object>: часто використовується для вставки Flash, ActiveX-компонентів та ін;
  • <applet>: використовується тільки для Java applets; все частіше замінюється на <object>;
  • <iframe>: використовується для вставки фреймів;
  • <embed>: використовується для програвання медіа файлів; все частіше замінюється на <object>;

Варто зазначити, що картинка обробляється браузером з використанням тегу <img>, і є особливою формою <object>, а отже теж може використовуватися для XSS-ін’єкції.

Як же ж забезпечити захист від XSS-ін’єкції? Нехай в додатку присутня деяка форма, яка передає дані в базу, які потім відображаються в самому додатку (наприклад гостьова книга). Необхідно ретельно перевіряти дані, що приходять з форми і не сподіватися на толерантність і культуру користувачів. Наприклад, користувач може в полі електронної почти ввести наступний код <script>аlert('Взламаний!');</script>. Результат виконання додатку який виведе введені дані буде, м’яко кажучи, неочікуваним.

Одним з методів фільтрування введених даних є їхня перевірка з використанням деякого шаблону. Найкращим чином ще можна зробити з використанням функції preg_match. Ця функція порівнює введену в неї в якості параметра стрічку з наперед заданим шаблоном. В разі співпадіння функція повертає TRUE. Наприклад,

preg_match("/^[a-z0-9_-]{1,20}@(([a-z0-9-]+\.)+(com|net|org|mil|edu|gov|ru|info|biz |inc|"."name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/is",$mail).

Дана стрічка перевіряє правильність написання електронної адреси. З допомогою функції eregi можна перевірити правильність вводу імені, наприклад:

eregi("[^a-za-я0-9_]",$nick).

В самому повідомленні користувача необхідно відфільтрувати введені ним HTML теги, особливо тег <script>. Це можна виконати функцією strip_tags, причому другим параметром цієї функції є список тих тегів, які не будуть фільтруватися. Приклад:

$string = strip_tags($string, "<a><b><i>");

В даному прикладі функція відфільтровує всі HTML-теги, за виключенням тегів <a>, <b> і <i>.

Іншим можливим варіантом є заміна потенційно небезпечних символів їхніми еквівалентами. Так використання функції htmlspecialchars() з параметром ENT_QUOTES дає можливість замінити деякі символи, які мають особливе значення в контексті HTML. Так,

  • & амперсанд замінюється на "&amp;";
  • " двійні лапки замінюються на "&quot;" тільки якщо не встановлений параметр ENT_QUOTES;
  • ' одинарна лапка замінюються на "&#039;" тільки коли встановлений ENT_QUOTES;
  • < замінюється на "&lt;";
  • > замінюється на "&gt";

Приклад використання:

$string = htmlspecialchars($tring, ENT_QUOTES)

Принциповою різницею між функціями htmlspecialchars і strip_tags є те, що перша замінює деякі особливі символи, після чого відфільтровані дані будуть відповідати оригіналу. strip_tags в свою чергу повністю усуває HTML-теги, розміщені між символами < і >.

Отже, використання простих правил по перевірці і фільтруванню введених користувачем даних дає можливість значно зменшити ризик XSS-ін’єкції.

© Інформаційні технології. Аналітика , Рідна Мережа