Загрузка...

CSRF уязвимость

CSRF (Cross-Site Request Forgery)

Что такое CSRF?

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

Пример CSRF атаки

У нас есть HTML-форма, которую пользователь должен заполнить: ввести адрес и нажать кнопку «Сохранить». В результате в бэкенд полетит POST-запрос с HTML-формой. Мы видим, что браузер автоматически поставил туда сессионные куки пользователя. Бэкенд, когда получит такой запрос, посмотрит, что есть такая сессия, это легитимный пользователь, и изменит ему адрес доставки.

Как это может произойти?

Пользователь получил email, перешел по ссылке на вредоносный сайт. Вредоносный сайт отправляет запрос с сессионными данными пользователя для изменения/подмены каких-то данных на атакуемом сайте.
csrf

Защита

Наиболее популярный метод защиты от такой атаки – использование уникального токена (генерируемого нашим сайтом и меняющегося с сессией пользователя или со временем) в составе полей формы на изменение данных. Это будет гарантировать, что форма отправлена с нашего сайта, а не вредоносного.
Для этого нужно изменить данные формы, добавить поле с csrf-ключем и сделать проверку csrf-ключа на стороне обработчика формы.

В Laravel

В laravel это будет выглядеть так:

<form method=“POST” action=“/somewhere”>
@csrf
<!– эквивалент для html, который генерирует @csrf —>
<input type=“hidden” name=“_token” value=“{{ csrf_token() }}” />
</form>

Код генерирует csrf-токен для каждой активной сессии на веб-сайте.

Проверяется токен через специальный middleware VerifyCsrfToken, входящий в состав прослоек для группы web.

В WordPress

В WordPress используется функция wp_nonce_field(); которая также генерируется html поле в составе формы. Проверка в обработчике осуществляется функцией wp_verify_nonce(), куда передаются данные запроса. Дополнить защиту, можно функцией wp_referer_field(), если запрос должен приходить только с определенной, заранее известной страницы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *