Як запобігти XSS Web Security Academy

У цьому розділі ми опишемо деякі загальні принципи запобігання уразливості міжсайтових сценаріїв та способи використання різних поширених технологій для захисту від атак XSS.

введення користувача

Запобігання сценаріям між сайтами, як правило, можна досягти за допомогою двох рівнів захисту:

Ви можете використовувати сканер відрижки для сканування веб-сайтів на наявність численних вразливих місць безпеки, включаючи XSS. Сучасна логіка сканування Берпа повторює дії кваліфікованого зловмисника і здатна досягти відповідно високого охоплення вразливостей XSS. Ви можете використовувати сканер відрижки, щоб отримати впевненість у тому, що ваш захист від атак XSS працює ефективно.

Кодувати дані на виході

Кодування слід застосовувати безпосередньо перед тим, як керовані користувачем дані записуються на сторінку, оскільки контекст, в який ви пишете, визначає, яке саме кодування вам потрібно використовувати. Наприклад, значення всередині рядка JavaScript вимагають іншого типу екранування до тих, що знаходяться в контексті HTML.

У контексті HTML вам слід перетворити значення, що не внесені до білого списку, в сутності HTML:

  • перетворює на:
  • > перетворює на:>

У контексті рядка JavaScript нелітерально-цифрові значення повинні бути захищені Unicode:

  • перетворює на: \ u003c
  • > перетворює на: \ u003e

Іноді вам потрібно застосувати кілька шарів кодування у правильному порядку. Наприклад, щоб безпечно вбудувати введення користувача в обробник подій, вам потрібно мати справу як з контекстом JavaScript, так і з контекстом HTML. Отже, спочатку потрібно вникнути вхідного коду Unicode, а потім HTML-кодувати його:

Підтвердити вхід після прибуття

Кодування - це, мабуть, найважливіший напрямок захисту XSS, але цього недостатньо для запобігання вразливості XSS у кожному контексті. Ви також повинні перевірити введення якомога суворіше в той момент, коли він вперше отриманий від користувача.

Приклади перевірки вхідних даних включають:

  • Якщо користувач подає URL-адресу, яка буде повернута у відповідях, підтверджуючи, що вона починається з безпечного протоколу, такого як HTTP та HTTPS. Інакше хтось може використати ваш сайт із шкідливим протоколом, таким як javascript або дані .
  • Якщо користувач надає значення, яке, як він очікував, буде числовим, перевіряючи, що значення насправді містить ціле число.
  • Перевірка того, що введення містить лише очікуваний набір символів.

Перевірка вхідних даних в ідеалі повинна працювати, блокуючи недійсне введення. Альтернативний підхід - спроба очистити недійсний ввід, щоб зробити його дійсним, є більш схильним до помилок, і його слід уникати, де це можливо.

Білий чи чорний списки

Перевірка вхідних даних, як правило, повинна використовувати білі списки, а не чорні списки. Наприклад, замість того, щоб намагатися скласти список усіх шкідливих протоколів (javascript, дані тощо), просто складіть список безпечних протоколів (HTTP, HTTPS) і забороніть будь-що, що не входить до списку. Це гарантуватиме, що ваш захист не зламається, коли з’являться нові шкідливі протоколи, і зробить його менш сприйнятливим до атак, які намагаються заплутати недійсні значення, щоб уникнути чорного списку.

Дозвіл "безпечного" HTML

Дозволяти користувачам розміщувати розмітку HTML слід уникати, де це можливо, але іноді це бізнес-вимога. Наприклад, сайт блогу може дозволити розміщувати коментарі, що містять обмежену розмітку HTML.

Класичний підхід полягає у спробі відфільтрувати потенційно шкідливі теги та JavaScript. Ви можете спробувати реалізувати це, використовуючи білий список безпечних тегів та атрибутів, але завдяки розбіжностям у механізмах синтаксичного аналізу браузера та химерностям, як мутація XSS, цей підхід надзвичайно складно безпечно реалізувати.

Найменш поганим варіантом є використання бібліотеки JavaScript, яка виконує фільтрацію та кодування в браузері користувача, наприклад DOMPurify. Інші бібліотеки дозволяють користувачам надавати вміст у форматі розмітки та конвертувати розмітку в HTML. На жаль, усі ці бібліотеки час від часу мають вразливості XSS, тому це не ідеальне рішення. Якщо ви використовуєте такий, вам слід уважно стежити за оновленнями безпеки.