Что такое CSRF?
CSRF (Cross-Site Request Forgery) – это вид уязвимости сайта. Когда может произойти подмена данных.
Простым языком, это подмена данных (как правило форм), отравляемых авторизованным пользователем через вредоносный ресурс (сайт, приложение).
Пример CSRF атаки
У нас есть HTML-форма, которую пользователь должен заполнить: ввести адрес и нажать кнопку «Сохранить». В результате в бэкенд полетит POST-запрос с HTML-формой. Мы видим, что браузер автоматически поставил туда сессионные куки пользователя. Бэкенд, когда получит такой запрос, посмотрит, что есть такая сессия, это легитимный пользователь, и изменит ему адрес доставки.
Как это может произойти?
Пользователь получил email, перешел по ссылке на вредоносный сайт. Вредоносный сайт отправляет запрос с сессионными данными пользователя для изменения/подмены каких-то данных на атакуемом сайте.
Защита
Наиболее популярный метод защиты от такой атаки – использование уникального токена (генерируемого нашим сайтом и меняющегося с сессией пользователя или со временем) в составе полей формы на изменение данных. Это будет гарантировать, что форма отправлена с нашего сайта, а не вредоносного.
Для этого нужно изменить данные формы, добавить поле с csrf-ключем и сделать проверку csrf-ключа на стороне обработчика формы.
В Laravel
В laravel это будет выглядеть так:
Код генерирует csrf-токен для каждой активной сессии на веб-сайте.
Проверяется токен через специальный middleware VerifyCsrfToken
, входящий в состав прослоек для группы web.
В WordPress
В WordPress используется функция wp_nonce_field();
которая также генерируется html поле в составе формы. Проверка в обработчике осуществляется функцией wp_verify_nonce()
, куда передаются данные запроса. Дополнить защиту, можно функцией wp_referer_field()
, если запрос должен приходить только с определенной, заранее известной страницы.