Что такое XSS-атака и как от неё защититься в Go?

Ответ

XSS (Cross-Site Scripting) — это тип атаки на веб-приложения, при которой злоумышленник внедряет вредоносный код (обычно JavaScript) на страницу, которую просматривают другие пользователи. Цель — выполнить этот код в браузере жертвы.

Типы XSS-атак:

  1. Хранимая (Stored XSS): Вредоносный скрипт сохраняется на сервере (например, в базе данных в комментарии пользователя) и выполняется каждый раз, когда страница с этим скриптом запрашивается другими пользователями.
  2. Отражённая (Reflected XSS): Скрипт является частью запроса к серверу (например, в URL-параметре) и "отражается" в ответе. Пользователь должен перейти по специально сформированной ссылке.
  3. DOM-based XSS: Уязвимость находится в клиентском коде. Вредоносная нагрузка выполняется в результате изменения DOM-дерева страницы без обращения к серверу.

Как защититься в Go:

Основной принцип защиты — никогда не доверять данным, пришедшим от пользователя, и всегда экранировать их перед выводом.

  1. Использование пакета 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>&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;</div>
  2. Валидация и очистка (Sanitization): Проверяйте и очищайте пользовательский ввод на стороне сервера перед сохранением или использованием. Например, с помощью библиотек вроде bluemonday.

  3. Content Security Policy (CSP): Используйте HTTP-заголовок Content-Security-Policy, чтобы указать браузеру, из каких источников разрешено загружать и выполнять скрипты. Это мощный дополнительный уровень защиты.