\n```\n\nПриложение напрямую отражает параметр в ответе:\n\n```html\n\n

Результаты поиска:

\n```\n\n**Уязвимый код:**\n\n```javascript\n// React — опасно!\nfunction SearchResults() {\n const query = new URLSearchParams(window.location.search).get('q');\n return
;\n}\n```\n\n#### 2. Stored XSS (Сохранённая)\n\nВредоносный код сохраняется в БД и выполняется для всех пользователей:\n\n```javascript\n// Небезопасно: сохраняем пользовательский ввод как есть\nfunction createComment(text) {\n // text может быть: \n db.comments.insert({ content: text });\n}\n\n// При отображении:\nfunction Comment({ content }) {\n return
;\n}\n```\n\n#### 3. DOM-based XSS\n\nУязвимость в JavaScript коде, который небезопасно работает с DOM:\n\n```javascript\n// Небезопасно!\nfunction updateProfile() {\n const name = document.getElementById('name').value;\n document.getElementById('greeting').innerHTML = `Hello, ${name}`;\n}\n\n// Если ввести: \n// То произойдёт выполнение скрипта\n```\n\n### Последствия XSS атак\n\nЗлоумышленник может:\n\n- **Украсть cookies/tokens** — получить доступ к аккаунту\n- **Перенаправить на фишинг сайт** — обманом получить пароли\n- **Изменить содержимое страницы** — распространить вредоноса или ложную информацию\n- **Выполнить действия от имени пользователя** — создать посты, отправить сообщения\n- **Установить malware** — перенаправить на вредоносный сайт\n\n### Как защищаться от XSS\n\n#### 1. Экранирование (Escaping)\n\nПреобразуй специальные символы в HTML entities:\n\n```html\n\n
{{ userInput }}
\n\n\n
{userInput}
\n```\n\n**Пример экранирования:**\n\n```javascript\nfunction escapeHtml(text) {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return text.replace(/[&<>\"']/g, m => map[m]);\n}\n\nconst userInput = '';\nconst safe = escapeHtml(userInput);\n// Результат: <img src=x onerror="alert(1)">\n// Это будет отображено как текст, не выполнится\n```\n\n#### 2. Использование tekstContent вместо innerHTML\n\n```javascript\n// Небезопасно\nelement.innerHTML = userInput; // Выполняет скрипты\n\n// Безопасно\nelement.textContent = userInput; // Отображает как текст\n```\n\n#### 3. React/Vue экранируют по умолчанию\n\n```jsx\n// Безопасно! React экранирует\nfunction Comment({ text }) {\n return
{text}
; // Будет отображено как текст\n}\n\n// Если нужно HTML, используй дополнительный контроль\nfunction UnsafeHTML({ html }) {\n // dangerouslySetInnerHTML требует явной разметки\n return
;\n}\n```\n\n#### 4. Content Security Policy (CSP)\n\nHTTP заголовок, ограничивающий источники скриптов:\n\n```\nContent-Security-Policy: script-src 'self'\n```\n\nЭто не позволит выполнять inline скрипты и скрипты с внешних источников.\n\n#### 5. Валидация ввода (Input Validation)\n\n```javascript\nfunction validateEmail(input) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(input);\n}\n\n// Принимаем только корректный email\nif (validateEmail(userInput)) {\n saveEmail(userInput);\n} else {\n showError('Invalid email');\n}\n```\n\n#### 6. Sanitization (Чистка HTML)\n\nДля случаев, когда нужно разрешить некоторый HTML, используй библиотеки:\n\n```javascript\nimport DOMPurify from 'dompurify';\n\nconst userInput = '

Safe text

';\nconst clean = DOMPurify.sanitize(userInput);\n// Результат:

Safe text

\n// Вредоносный код удален, безопасный HTML сохранен\n```\n\n### Практический пример: Безопасный комментарий\n\n```typescript\nimport React, { useState } from 'react';\nimport DOMPurify from 'dompurify';\n\ninterface CommentProps {\n authorName: string; // Экранируется автоматически\n content: string; // Экранируется автоматически\n allowedHtml?: boolean;\n}\n\nfunction Comment({ authorName, content, allowedHtml = false }: CommentProps) {\n // Для имени автора просто экранируем\n const safeName = authorName; // React сделает это\n \n // Для содержимого с HTML\n const safeContent = allowedHtml \n ? DOMPurify.sanitize(content)\n : content; // React экранирует\n\n return (\n
\n {safeName}\n {allowedHtml ? (\n
\n ) : (\n

{safeContent}

\n )}\n
\n );\n}\n\nexport default Comment;\n```\n\n### Чеклист безопасности\n\n- Никогда не используй `innerHTML` с пользовательским вводом\n- Экранируй весь пользовательский ввод\n- Используй `textContent` вместо `innerHTML`\n- Применяй Content Security Policy\n- Валидируй ввод на сервере\n- Используй HTTPS для передачи данных\n- Регулярно обновляй зависимости (в них могут быть уязвимости)\n- Тестируй приложение на XSS уязвимости\n\nXSS — критическая уязвимость, поэтому защита от неё должна быть приоритетом при разработке веб-приложений.","dateCreated":"2026-04-02T21:49:13.090723","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что такое XSS уязвимость?

1.6 Junior🔥 171 комментариев
#HTML и CSS#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

XSS (Cross-Site Scripting) уязвимость

XSS — это тип атаки, при которой злоумышленник внедряет вредоносный JavaScript код в веб-приложение, который затем выполняется в браузере других пользователей. Это одна из самых распространённых веб-уязвимостей.

Как работает XSS атака

Упрощённый пример:

  1. Пользователь А вводит комментарий: <img src=x onerror="alert('Hacked!')">
  2. Приложение сохраняет этот текст как есть в БД
  3. Пользователь Б видит этот комментарий на странице
  4. JavaScript из атрибута onerror выполняется в браузере пользователя Б
  5. Злоумышленник может украсть cookies, сессию, личные данные

Типы XSS атак

1. Reflected XSS (Отражённая)

Злоумышленник отправляет ссылку с вредоносным кодом в URL:

https://example.com/search?q=<script>alert('XSS')</script>

Приложение напрямую отражает параметр в ответе:

<!-- Небезопасно! -->
<h1>Результаты поиска: <script>alert('XSS')</script></h1>

Уязвимый код:

// React — опасно!
function SearchResults() {
  const query = new URLSearchParams(window.location.search).get('q');
  return <div dangerouslySetInnerHTML={{ __html: query }} />;
}

2. Stored XSS (Сохранённая)

Вредоносный код сохраняется в БД и выполняется для всех пользователей:

// Небезопасно: сохраняем пользовательский ввод как есть
function createComment(text) {
  // text может быть: <img src=x onerror="stealCookies()">
  db.comments.insert({ content: text });
}

// При отображении:
function Comment({ content }) {
  return <div dangerouslySetInnerHTML={{ __html: content }} />;
}

3. DOM-based XSS

Уязвимость в JavaScript коде, который небезопасно работает с DOM:

// Небезопасно!
function updateProfile() {
  const name = document.getElementById('name').value;
  document.getElementById('greeting').innerHTML = `Hello, ${name}`;
}

// Если ввести: <img src=x onerror="alert('XSS')">
// То произойдёт выполнение скрипта

Последствия XSS атак

Злоумышленник может:

  • Украсть cookies/tokens — получить доступ к аккаунту
  • Перенаправить на фишинг сайт — обманом получить пароли
  • Изменить содержимое страницы — распространить вредоноса или ложную информацию
  • Выполнить действия от имени пользователя — создать посты, отправить сообщения
  • Установить malware — перенаправить на вредоносный сайт

Как защищаться от XSS

1. Экранирование (Escaping)

Преобразуй специальные символы в HTML entities:

<!-- Небезопасно -->
<div>{{ userInput }}</div>

<!-- Безопасно в современных фреймворках -->
<div>{userInput}</div>  <!-- React, Vue экранируют по умолчанию -->

Пример экранирования:

function escapeHtml(text) {
  const map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };
  return text.replace(/[&<>"']/g, m => map[m]);
}

const userInput = '<img src=x onerror="alert(1)">';
const safe = escapeHtml(userInput);
// Результат: &lt;img src=x onerror=&quot;alert(1)&quot;&gt;
// Это будет отображено как текст, не выполнится

2. Использование tekstContent вместо innerHTML

// Небезопасно
element.innerHTML = userInput;  // Выполняет скрипты

// Безопасно
element.textContent = userInput;  // Отображает как текст

3. React/Vue экранируют по умолчанию

// Безопасно! React экранирует
function Comment({ text }) {
  return <div>{text}</div>;  // Будет отображено как текст
}

// Если нужно HTML, используй дополнительный контроль
function UnsafeHTML({ html }) {
  // dangerouslySetInnerHTML требует явной разметки
  return <div dangerouslySetInnerHTML={{ __html: html }} />;
}

4. Content Security Policy (CSP)

HTTP заголовок, ограничивающий источники скриптов:

Content-Security-Policy: script-src 'self'

Это не позволит выполнять inline скрипты и скрипты с внешних источников.

5. Валидация ввода (Input Validation)

function validateEmail(input) {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(input);
}

// Принимаем только корректный email
if (validateEmail(userInput)) {
  saveEmail(userInput);
} else {
  showError('Invalid email');
}

6. Sanitization (Чистка HTML)

Для случаев, когда нужно разрешить некоторый HTML, используй библиотеки:

import DOMPurify from 'dompurify';

const userInput = '<img src=x onerror="alert(1)"><p>Safe text</p>';
const clean = DOMPurify.sanitize(userInput);
// Результат: <p>Safe text</p>
// Вредоносный код удален, безопасный HTML сохранен

Практический пример: Безопасный комментарий

import React, { useState } from 'react';
import DOMPurify from 'dompurify';

interface CommentProps {
  authorName: string;  // Экранируется автоматически
  content: string;     // Экранируется автоматически
  allowedHtml?: boolean;
}

function Comment({ authorName, content, allowedHtml = false }: CommentProps) {
  // Для имени автора просто экранируем
  const safeName = authorName;  // React сделает это
  
  // Для содержимого с HTML
  const safeContent = allowedHtml 
    ? DOMPurify.sanitize(content)
    : content;  // React экранирует

  return (
    <div className="comment">
      <strong>{safeName}</strong>
      {allowedHtml ? (
        <div dangerouslySetInnerHTML={{ __html: safeContent }} />
      ) : (
        <p>{safeContent}</p>
      )}
    </div>
  );
}

export default Comment;

Чеклист безопасности

  • Никогда не используй innerHTML с пользовательским вводом
  • Экранируй весь пользовательский ввод
  • Используй textContent вместо innerHTML
  • Применяй Content Security Policy
  • Валидируй ввод на сервере
  • Используй HTTPS для передачи данных
  • Регулярно обновляй зависимости (в них могут быть уязвимости)
  • Тестируй приложение на XSS уязвимости

XSS — критическая уязвимость, поэтому защита от неё должна быть приоритетом при разработке веб-приложений.