CSRF — Аббревиатура, которой обозначают межсайтовую подделку запросов, произошло от сокращения «Cross-site request forgery». Для лучшего понимания давайте приведём пример из жизни. Предположим, что у нас на сайте есть какая-либо форма с полями. Данные с формы отправляются на сервер POST-запросом с нашей формы. Однако не исключено что запрос на сервер могут отправить и другого ресурса, подделав таким образом POST-запрос. Разумеется, это может быть использовано злоумышленниками в целях подделки запросов на сервер.
В Laravel, чтобы исключить подобные явления, существует специальный механизм для работы форм – это генерация уникального токена который добавляется на форму. Механизм работает довольно просто, сам фреймворк генерирует уникальный код – token при каждом запросе формы. Его значение мы добавляем на форму в качестве скрытого поля. Т.к. код меняется при каждом запросе, подделать запрос со стороны становится гораздо сложнее.
Механизм защиты от CSRF добавляется на форму в Laravel довольно просто. Достаточно в шаблоне, внутри POST-формы добавить код @csrf. Если мы будем отправлять форму без токена, то фреймворк выдаст ошибку: «419 | Page expired». Это означает, что токен при отправке форм использовать нужно всегда и обязательно.
Теперь к примеру, создадим простую форму обратной связи. В роутах будет два пути – первый будет содержать страницу с формой, второй – обрабатывать POST запрос.
1 2 3 4 5 6 7 8 | В файле /routes/web.php добавляем код: Route::get( '/contact' , function () { return view( 'contact' ); }); Route::post( '/contact/submit' , function () { return "All Ok!" ; })->name( 'contact-form' ); |
Как вы можете заметить в первом методе идёт обработка GET-запроса по пути /contact, второй метод обрабатывает POST-запрос с формы, по пути /contact/submit. В случае успешного запроса, метод вернёт надпись «All Ok!», которую мы увидим в браузере.
Теперь к самой форме, которая будет находится в файле шаблона: \resources\views\contact.blade.php
На форме кроме стандартных полей, следует добавить код токена, внутри тега form – строка @csrf.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | < form method = "post" action = "{{ contact-form }}" > @csrf <!--вставка token-а--> < div class = "form-group" > < label for = "person_name" >Ваше имя</ label >< br > < input type = "text" id = "person_name" name = "person-name" > </ div > < div class = "form-group" > < label for = "person_email" >Email*</ label >< br > < input type = "text" name = "email" id = "person_email" > </ div > < div class = "form-group" > < label for = "message" >Сообщение</ label >< br > < textarea name = "message" id = "message" ></ textarea > </ div > < button type = "submit" class = "btn btn-success" >Отправить</ button > </ form > |
После этого, открыв страницу в браузере, мы можем заметить в исходном коде скрытое поле с именем _token. В качестве значения value – находится как раз тот самый защитный код, который проверяется фреймворком при отправке формы на сервер.
Без этого токена форма работать не будет. В Laravel во многих моментах можно заметить реализацию различных механизмов, чтобы оградить ваш проект от возможных неявных проблем с безопасностью. На этом у меня всё, всего доброго!