Ранее я обсуждал Шаблон токенов синхронизатора как одно из решений для атаки подделки межсайтовых запросов на веб-приложения. Этот метод является лучшим способом, который мы можем использовать для смягчения атак CSRF в случае, если сохранение токена CSRF в сеансе в методе шаблона токена синхронизатора проблематично.
В этом сообщении блога обсуждается шаблон Double Submit Cookie для предотвращения атаки CSRF.
Что это значит?
Двойная отправка файлов cookie определяется как отправка случайного значения как в файле cookie, так и в качестве параметра запроса, при этом сервер проверяет, равны ли значение файла cookie и значение запроса.
Как это работает?
Когда пользователь аутентифицируется на сайте, сайт должен сгенерировать идентификатор сеанса и установить файл cookie в браузере. В то же время он генерирует зашифрованное случайное значение или токен CSRF для сеанса и устанавливает его как файл cookie в браузере компьютера пользователя отдельно от идентификатора сеанса. Серверу не нужно каким-либо образом сохранять это значение, поэтому этот паттерн иногда также называют Stateless CSRF Defense.
Затем сайт требует, чтобы каждый запрос включал это случайное значение в качестве скрытого значения формы. Злоумышленник не может прочитать какие-либо данные, отправленные с сервера, или изменить значения файлов cookie в соответствии с политикой того же источника.
В случае этого метода смягчения последствий работа клиента очень проста; просто извлеките файл cookie CSRF из ответа и добавьте его в специальный заголовок ко всем запросам.
Ниже приведено веб-приложение, использующее шаблон Double Submit Cookie с использованием PHP и JavaScript.
Исходный код приложения: Ссылка на GitHub
Во-первых, вам необходимо авторизоваться в приложении, введя логин и пароль. Для приложения я жестко закодировал учетные данные как имя пользователя: admin и пароль: admin
шаг 1: пользователь должен войти в приложение, используя учетные данные пользователя
Сообщение об ошибке будет отображаться, если пользователь введет неверные учетные данные следующим образом.
Шаг 2: Когда пользователь нажимает кнопку «Войти» после ввода действительных учетных данных, данные отправляются на сторону сервера (login.php) и аутентифицируют пользователя, запускают сеанс и устанавливают 2 файла cookie в веб-браузере клиента.
шаг 3: когда клиент отправил форму, он должен иметь скрытое поле для хранения токена CSRF.
Шаг 4: Затем давайте проверим server.php, который сравнивает встроенное значение CSRF и значение файла cookie CSRF.
Шаг 5: Когда пользователь нажимает кнопку обновления, отправляется запрос POST. Потом,
- Сервер проверяет заголовок файла cookie для идентификатора сеанса.
- Сервер сравнивает токен CSRF из тела запроса с токеном CSRF файла cookie заголовка.
Сервер принимает запрос, если эти токены совпадают,
Сервер отклоняет запрос, если токены не совпадают.
Как мы можем сказать, что метод безопасен?
Файлы cookie отправляются автоматически с каждым запросом, независимо от того, был ли запрос инициирован исходным сайтом или сторонним сайтом. Вот почему одного файла cookie недостаточно, поскольку каждый запрос будет содержать его.
Но имея токен также в самом запросе, атакующий сайт больше не может генерировать действительные запросы, поскольку они не могут завладеть токеном пользователя.
Исходный код приложения: Ссылка на GitHub