Ответ
XSS (Cross-Site Scripting) — это атака, при которой вредоносный скрипт внедряется в веб-страницу и выполняется в браузере пользователя. Основной принцип защиты — никогда не доверять данным, приходящим от пользователя, и обрабатывать их соответствующим образом.
Основные методы защиты в Go:
-
Контекстное экранирование (Contextual Escaping): Это главный механизм защиты. Пакет
html/template
в Go делает это автоматически. Он анализирует структуру HTML и применяет правильное экранирование в зависимости от контекста (внутри HTML-тега, в значении атрибута, в URL и т.д.).import ( "html/template" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { // userInput может содержать вредоносный код, например, "<script>alert('xss')</script>" userInput := r.FormValue("comment") tmpl := template.Must(template.New("example").Parse(`<div>{{.}}</div>`)) // При выполнении шаблона Go автоматически заменит < на <, > на > и т.д. tmpl.Execute(w, userInput) }
-
Валидация и санация ввода: Прежде чем сохранять или отображать данные, проверяйте их на соответствие ожидаемому формату (например, email, число, определенный набор символов). Используйте библиотеки для санации HTML, если вам нужно разрешить пользователям вводить форматированный текст (например,
bluemonday
).
Дополнительные уровни защиты (Defense in Depth):
- Content Security Policy (CSP): Установите заголовок ответа
Content-Security-Policy
. Он позволяет браузеру выполнять скрипты, стили и другие ресурсы только из доверенных источников, что может полностью заблокировать выполнение внедренных скриптов. HttpOnly
флаг для Cookies: Устанавливайте cookie с флагомHttpOnly
, чтобы они были недоступны для чтения из JavaScript. Это защищает сессионные cookie от кражи через XSS.http.SetCookie(w, &http.Cookie{ Name: "session_id", Value: "some-secret-value", HttpOnly: true, // <-- Важный флаг })
- Правильный
Content-Type
: Всегда отправляйте заголовокContent-Type: text/html; charset=utf-8
, чтобы браузер не пытался интерпретировать страницу как другой тип контента, что может создать уязвимость.