> Что такое CSRF и как определить поддельный запрос (Go)

Уровень: junior · Роль: backend · Категория: Технические вопросы

Компании: VK

Стек: Go

> Пример ответа

CSRF (Cross-Site Request Forgery) - это тип атаки, при котором злоумышленник заставляет аутентифицированного пользователя выполнить нежелательное действие на доверенном сайте. Например, пользователь заходит на банковский сайт, а затем на вредоносный, который отправляет запрос на перевод денег, используя куки банка.

В Go для защиты от CSRF обычно используют токены (CSRF tokens). Сервер генерирует уникальный токен, привязывает его к сессии пользователя и вставляет в HTML-форму или заголовок запроса. При отправке запроса сервер сравнивает полученный токен с сохранённым в сессии. Если они не совпадают - запрос считается поддельным.

Пример реализации в Go с использованием пакета gorilla/csrf:

GO
import (
"github.com/gorilla/csrf"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
// Защита всех POST/PUT/DELETE запросов
r.Use(csrf.Protect([]byte("32-байтный-секретный-ключ")))
r.HandleFunc("/transfer", transferHandler).Methods("POST")
}
func transferHandler(w http.ResponseWriter, r *http.Request) {
// Токен автоматически проверяется middleware
// Если невалиден - возвращается 403
// Для форм используем csrf.TemplateField(r)
}

Как определить поддельный запрос:

  1. Отсутствие CSRF-токена в запросе (проверка заголовка X-CSRF-Token или поля формы).

  2. Несовпадение токена с сохранённым в сессии.

  3. Проверка заголовка Origin или Referer (но это менее надёжно, так как их можно подделать).

Дополнительно: для API (например, REST) часто используют токены в заголовке Authorization или X-API-Key, что также защищает от CSRF, так как браузер не отправляет их автоматически.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью