Как получить ключ формы в Magento 2
Ключ формы в Magento 2 используется в качестве средства защиты от подделки межсайтовых запросов (CSRF – Cross-site request forgery).
Что такое межсайтовая подделка запроса? Когда вы перемещаетесь по веб-странице, ваш браузер делает запросы к удаленному серверу для получения контента и/или манипулирования данными, хранящимися на сервере. Ваш браузер будет отправлять GET запросы для чтения информации и POST или PUT запросы при создании или обновлении информации. GET запросы происходят, например, когда ваш браузер запрашивает такие ресурсы, как картинки, CSS и JavaScript файлы. POST-запрос чаще всего возникает, когда вы отправляете форму из веб-браузера. Хакеры в основном заинтересованы в подделке вот этих POST-запросов. Это и есть межсайтовая подделка запроса. Злоумышленник заставляете браузер делать запросы на сайте от имени аутентифицированного пользователя и без его ведома.
А способы защиты от таких атак заключаются в том, чтобы проверять клиента, который делает запросы. Вот почему мы авторизуемся на сайтах. После авторизации мы получаем специальный токен (cookie), с помощью которого мы идентифицируемся на сервере, который предоставил нам этот токен. Cookie – это ключ, с помощью которого мы доказываем серверу, кто мы есть. А для защиты форм в основном используется специальный уникальный ключ, который присваивается каждому отдельному клиенту на сайте. В Magento 2 для защиты форм используется ключ формы, который присваивается каждому отдельному пользовательскому сеансу.
В сегодняшней статье мы рассмотрим на практике вопрос добавления для любой формы на сайте уникального ключа пользовательского сеанса. Все действия контроллера Magento 2, с целью защиты от CSRF, потом проверяют этот ключ, прежде чем сделать что-либо важное.
Получение и вывод ключа формы в Magento 2
Чтобы получить уникальный ключ для формы, вам нужно использовать класс \Magento\Framework\Data\Form\FormKey
в качестве зависимости в вашем Блоке. А потом получить этот ключ для формы с помощью метода getFormKey()
.
Вот как это выглядит на практике:
<?php namespace {VENDOR}\{Module}\Block; use \Magento\Framework\View\Element\Template; use \Magento\Framework\View\Element\Template\Context; use \Magento\Framework\Data\Form\FormKey; class MyBlock extends Template { protected $formKey; public function __construct(FormKey $formKey, Context $context, array $data = []) { $this->formKey = $formKey; parent::__construct($context, $data); } public function getFormKey() { return $this->formKey->getFormKey(); } }
После этого вы можете использовать этот метод в своем шаблоне, например, так:
<?php /** @var $block {VENDOR}\{Module}\Block\MyBlock */ ?> <form action="/myform" method="post"> <input type="hidden" name="form_key" value="<?php echo $block->getFormKey(); ?>" /> <!-- ... остальная часть формы ... --> </form>
Замените {VENDOR}\{Module}
на свое пространство имен и свое название модуля.
В результате это приведет к созданию скрытого текстового поля input
с ключом формы вида:
<input type="hidden" name="form_key" value="a7yRSvrxnQr5B62o">
Вот и все!
Если вы не знаете, как работает добавление классов в качестве зависимостей, ознакомьтесь с нашей предыдущей статьей: Инъекции зависимостей в Magento 2 – основы их использования.
Спасибо, что читаете нас!