Цивільно-імперські послуги; структурне будівництво
Як використовувати Javascript для виявлення та попередження сценаріїв веб-сайтів (xs)
Table of Contents
Вступ до сценаріїв Cross-Site (XSS) та захисту JavaScript
Списання сайтів (XSS) є одним з найбільш поширених вразливостей веб-безпеки, послідовно рейтинг в OWASP Top 10. Спадок дозволяє атакувати форсунки для введення шкідливих клієнтських сценаріїв на веб-сторінках, виданих іншими користувачами. Ці скрипти можуть крадіжки токени, перенаправлення користувачів на сайти, деобличчччя сторінок, або встановити шкідливе програмне забезпечення. Хоча серверна частина санітарії є критичним, JavaScript грає жильову роль на стороні клієнта, щоб виявити і запобігти цих атак. Ця стаття забезпечує всебічний, виробничо-читацький посібник, щоб захистити ваші програми з XSS.
Розуміння трьох типів XSS
Перед тим як дайвінг в профілактику, важливо розуміти три основні категорії XSS: зберігати, відобразити і DOM-на основі. Кожен вимагає трохи різних засобів виявлення і профілактики.
СКАЧАТИ СКАЧАТИ
Зберігати (персональні) XSS відбувається, коли шкідливий вхід зберігається на сервері (наприклад, в базі даних, форумі, або коментарях) і пізніше подається користувачам без належної санітарії. Заборонено перезавантаження на атаку здійснюється в браузері будь-якого перегляду збереженого вмісту.
Відображені XSS
Відображені XSS відбуваються, коли шкідливий скрипт відбивається на веб-сервері, як правило, через параметр URL або подання форми. Атакатор прагне жертву натискати ремеслане посилання, а в'язаний код виконує відразу. На відміну від збережених XSS, завантаження не зберігається.
СКАЧАТИ ОДОМ-БАСОВАНІ XSS
DOM-на основі XSS є чистою вразливістю клієнтів. Завантажувальний навантаження на атаку модіфікує середовище DOM у браузері жертви. Зловлений код ніколи не торкається сервера; він походить від клієнтського JavaScript, який небезпечний ручить введення користувача (наприклад, читання з , , або ).
Виявлення SS Атак з JavaScript
Виявлення про підозру в роботі перед пошкодженням відбувається. JavaScript може контролювати введення користувачів, відстежувати переміщення DOM та перевіряти дані в пунктах входу. Хоча виявлення клієнта не може зловити всі атаки (особливо якщо атакуючий ремісничий ремесла запити безпосередньо на сервер), він забезпечує цінний рядок захисту.
Вступна вірність та санітарія
Завжди валідуйте і встановіть вводи користувачів на стороні клієнта перед обробкою. Використовуйте замість для запобігання виконання сценаріїв. Наступна функція смуги небезпечних символів з рядка:
function sanitizeInput(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}
Це працює, оскільки налаштування не інтерпретує теги HTML; він лікує все як звичайний текст. Отримано містить в собі втечу версію будь-яких спеціальних символів HTML (наприклад, , , .
Моніторинг OM Мутацій для підозрілих елементів
Атакери часто вводять теги або обробники подій (], ) в DOM. Використання API, ви можете дивитися для несподіваних вставок елемента. Базовий приклад:
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // element node
if (node.tagName === 'SCRIPT') {
console.warn('Potential XSS: a script element was injected via DOM.');
node.remove(); // or log and analyze
}
// Check for dangerous attributes
if (node.hasAttribute('onerror') || node.hasAttribute('onload')) {
console.warn('Suspicious event handler attribute detected.');
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
Кауція: Блокування сценаріїв через може бути обходжений нападниками кліента і може зламати законну функціональність. Використовуйте це як інструмент моніторингу, а не механізм первинної профілактики.
Перевірка параметрів URL та Hash
Для DOM-на основі XSS, читайте компоненти URL безпечно за допомогою і не впустіть безпосередньо вставку значень в HTML. Виявлення спроб перенести виконуваний код:
const params = new URLSearchParams(window.location.search);
const userParam = params.get('name');
if (userParam && /[<>"'\/]/.test(userParam)) {
console.warn('Potential XSS in parameter: ' + userParam);
// Do not use this value in the DOM without encoding
}
Запобігання атакам SS з JavaScript
Профілактика вимагає багатошарового підходу. JavaScript самостійно не може забезпечити повну безпеку програми, але при поєднанні з правильним заднім санітарії та . Політика безпеки (CSP), різко знижує ризик.
Закодувати всі дані користувачів, які надходять в DOM
Золоте правило: ніколи не вставляє ненадійні дані безпосередньо в DOM. Використовуйте безпечні методи DOM замість внутрішньогоHTML.
або
const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);
Коли Ви повинні використовувати , Санітез з бібліотекою
Якщо вам необхідно повністю надати HTML (наприклад, з багатого текстового редактора), спираючись на бібліотеку довіреної санітарії, як DOMPurify]. DOMPurify є широко використовуваною, бібліотечною бібліотекою, яка видаляє шкідливий код при збереженні безпечного HTML.
// Example with DOMPurify (install via npm or CDN)
const dirty = '<img src=x onerror="alert(1)">';
const clean = DOMPurify.sanitize(dirty);
document.getElementById('content').innerHTML = clean;
DOMPurify працює, за допомогою пароля введення, демонтаж небезпечних тегів і атрибутів, і повернення тільки дозволених елементів. Переглянути DOMPurify на GitHub.
Уникайте небезпечних функцій JavaScript
Деякі методи JavaScript і властивості неординарні для надання XSS. Уникайте або суворого керування:
- — або правильно санітарно-гігієнічне використання.
- , — же правило.
- — ніколи не використовується з введенням користувача.
- — може бути використаний, якщо будь-який вхід не буде забруднений.
- / з кодом рядка — не уникнути; замість функції використовуйте посилання.
- конструктор — аналог .
Впровадження політики безпеки контенту (CSP) через JavaScript? Не рекомендується
CSP - це механізм браузера, який обмежує які скрипти можуть працювати. Він зазвичай встановлюється через HTTP-головки, але ви також можете встановити його за допомогою тег або через JavaScript, динамічно створюючи елемент . Однак налаштування CSP у JavaScript менш захищено, тому що атакуючий, який вже має деякий контроль, може його вимкнути. Завжди віддайте перевагу HTTP-голові. Якщо ви повинні використовувати JavaScript для виконання CSP (наприклад, під час розробки), це дуже рано на завантаження сторінки:
const meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'self'; script-src 'self' 'unsafe-inline'"; // Be very careful with 'unsafe-inline'
document.head.appendChild(meta);
Для виробництва, налаштування CSP в вашому веб-сервері або зворотному проксі. документації МДМН CSP] забезпечує всебічне керівництво.
Додаткові заходи безпеки
За межами тактики JavaScript-специфічної, повна стратегія запобігання XSS включає в себе ці критичні заходи:
- Always, які діють на сервері . Перевірка Клієнта може бути обходжено. Не довіряйте дані клієнтів.
- Використовувати відповідні HTTP-репортажі , , і особливо .
- Пошуковий код кожного разу, коли ви надаєте дані користувача] Контексти: кодування HTML-сутностей, кодування URL, кодування рядків тощо.
- Keep залежностей оновлено Ви зможете використовувати JavaScript-бібліотеки (наприклад, старі версії jQuery) є загальним вектором XSS. Використовуйте npm аудиту або аналогічні інструменти.
- Використовувати рамки з вбудованим захистом XSS React, Angular і Vue автоматично втекти вихід за замовчуванням. Натюрморт, бути обережним або .
- Запровадження суворого CSP і при можливості. Використовуйте некції або хеш для inline скриптів.
Приклад реального світу: Безпечний коментар
Вкажіть систему коментаря блогу, де користувачі подають повідомлення, які відображаються іншим особам. Ататар може спробувати вставляти . Ось JavaScript підхід, який інтегрується з Backend:
- Подання посилок: Санітезування за допомогою перед відправкою на сервер (але сервер все ще повинен бути санізований).
- Сервер повертає дані:. Задняк повинен HTML-кодувати текст коментаря.
- Клієнт рендерингу: або безпечний двигун шаблону. Ніколи не використовуйте з сирими даними користувача.
function renderComment(comment) {
const item = document.createElement('div');
item.className = 'comment';
const body = document.createElement('p');
body.textContent = comment.body; // escaped by browser
item.appendChild(body);
document.getElementById('comments').appendChild(item);
}
Тестування ваших оборон
Після здійснення профілактики, перевірте вашу заявку за допомогою автоматизованих сканерів та ручних перевантажень. До загальнодоступних тестових векторів відносяться:
- ]
- ]
- ]
- ]
- ]
Використовуйте інструменти розробника веб-переглядача для вивчення DOM та забезпечення перевантаження. Також, тестування CSP-контролю, перевіривши консолі для звітів про порушення.
Висновок
Списання сайтів залишається серйозною загрозою, але JavaScript пропонує потужні інструменти для виявлення та профілактики. Виходячи з вводів, моніторинг змін DOM, вихідної вихідної частини та інтеграція з надійними бібліотеками, такими як DOMPurify, ви можете значно затвердити вашу клієнтську безпеку. Пам'ятайте, що клієнтські заходи не є срібною куля; вони доповнюють стратегію захисту, яка включає в себе серверні сантизацію, глави CSP та регулярні перевірки безпеки. Перебування порушника, тест часто і тримати ваші бібліотеки до дати.
Для подальшого читання зверніться до , на сторінці та , через , через що ви можете видалити файл .