Динамічні веб-сайти активно працюють із даними, отриманими від користувачів. Тобто, по суті, майже вся інформація на сайті була додана туди самими користувачами. Хороший приклад такого сайту - це форум. Будь-який форум на 99,9% складається з опублікованої там користувачами інформації. Але щоразу, коли користувачам надаються будь-які можливості, потрібно бути готовими до використання цих можливостей не за призначенням.
Так, форми для публікації контенту можуть використовувати не для надсилання нешкідливих текстів, а для зараження вашого сайту шкідливим кодом.
Будь-яку інформацію, отриману від користувача, обов'язково треба фільтрувати перед виведенням у шаблоні! Фільтрація означає застосування до цієї інформації набору правил, які очистять і підготують її до публікації на сайті. Ми фільтруємо інформацію, щоб не допустити появи на нашому сайті XSS-вразливості.
XSS - це вид уразливості, яка властива веб-додаткам. Ця атака на сайт полягає в тому, що у сторінку, яка видається, впроваджується шкідливий JavaScript-код. Це стає можливим через недостатню фільтрацію даних, отриманих від користувача.
На сайті є форма для публікації повідомлення.
Через цю форму хакер замість простого тексту відправляє JS-код.
Повідомлення публікується на сторінці, яка доступна всім відвідувачам.
Шкідливий код виконується для кожного відвідувача цієї сторінки.
Шкідливий скрипт шкодить користувачам сайту. Наприклад, краде їхні куки.
Проблема зрозуміла. Треба убезпечити сторінку, відфільтрувавши інформацію з форми. Але як фільтрувати, щоб не втратити текст, але при цьому позбавити хакера можливості нам нашкодити? Тут допоможуть HTML-мнемоніки.
Мнемоніка - це кодове представлення символу в HTML, який починається зі знака амперсанду & і завершується крапкою з комою ;.
Теги <script> складаються з трикутних дужок, а отже, якщо їх замінити на мнемоніки, то такий текст більше не буде трактуватися браузером як HTML-тег. Мнемоніки часто використовуються, коли треба показати користувачеві фрагмент з HTML-кодом на сторінці. Зазирнувши у вихідний код такої сторінки, можна побачити, що замість лапок і дужок у цьому HTML-коді знаходяться мнемоніки.
Є й інший варіант фільтрації: просто вирізати всі теги з тексту. Немає тегів - немає проблеми.
Перейдемо до практики. У PHP-сценарії додамо виклик функції, яка для переданого рядка виконає фільтрацію і замінить усі небезпечні символи в ньому на відповідні HTML-мнемоніки. Така функція називається htmlspecialchars. Ось як виглядає її робота:
<?php
$text = "<script><script>"; // цей рядок ми отримали від користувача
$safe_str = htmlspecialchars($text); // відфільтрований, безпечний рядок
print($safe_str); // дізнаємося, що вийшло
Результат роботи цього сценарію: <script></script>
Ніколи не забувайте використовувати функцію htmlspecialchars під час виведення інформації від користувачів у шаблоні!