Ответ
XSS (Cross-Site Scripting) — это тип атаки на веб-приложения, при которой злоумышленник внедряет вредоносный код (обычно JavaScript) на страницу, которую просматривают другие пользователи. Цель — выполнить этот код в браузере жертвы.
Типы XSS-атак:
- Хранимая (Stored XSS): Вредоносный скрипт сохраняется на сервере (например, в базе данных в комментарии пользователя) и выполняется каждый раз, когда страница с этим скриптом запрашивается другими пользователями.
- Отражённая (Reflected XSS): Скрипт является частью запроса к серверу (например, в URL-параметре) и "отражается" в ответе. Пользователь должен перейти по специально сформированной ссылке.
- DOM-based XSS: Уязвимость находится в клиентском коде. Вредоносная нагрузка выполняется в результате изменения DOM-дерева страницы без обращения к серверу.
Как защититься в Go:
Основной принцип защиты — никогда не доверять данным, пришедшим от пользователя, и всегда экранировать их перед выводом.
-
Использование пакета
html/template
(основной метод): Этот пакет автоматически выполняет контекстное экранирование данных. Он понимает, куда вставляются данные (в HTML-тег, атрибут, URL), и применяет нужный тип экранирования.❌ Небезопасно (ручная вставка):
// userInput = "<script>alert('xss')</script>" fmt.Fprintf(w, "<div>%s</div>", userInput) // Вывод: <div><script>alert('xss')</script></div>
✅ Безопасно (с
html/template
):import "html/template" // userInput = "<script>alert('xss')</script>" tmpl, _ := template.New("safe").Parse(`<div>{{.}}</div>`) tmpl.Execute(w, userInput) // Вывод: <div><script>alert('xss')</script></div>
-
Валидация и очистка (Sanitization): Проверяйте и очищайте пользовательский ввод на стороне сервера перед сохранением или использованием. Например, с помощью библиотек вроде
bluemonday
. -
Content Security Policy (CSP): Используйте HTTP-заголовок
Content-Security-Policy
, чтобы указать браузеру, из каких источников разрешено загружать и выполнять скрипты. Это мощный дополнительный уровень защиты.