Как получить ключ формы в 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 – основы их использования.
Спасибо, что читаете нас!
Последние посты
Как выбрать идеальный ноутбук: Полный гайд
Выбор ноутбука может быть сложной задачей в мире, где рынок переполнен вариантами на любой вкус… Читать далее
Томас Эдисон
Наша самая большая слабость заключается в том, что мы быстро сдаемся. Самый верный способ добиться… Читать далее
Самые красивые и впечатляющие мосты со всего мира (ТОП-10)
Мост — это нечто большее, чем просто сооружение, соединяющее два берега. Для того, чтобы появился… Читать далее
Соломон
Жизнь нас учит, что свою пару мы познаем, когда разводимся, своих братьев мы познаем, когда… Читать далее
Чак Паланик
Кто может — тот делает. Кто не может — тот критикует Чак Паланик Читать далее
Ричард Бах
Ни одно желание не дается тебе отдельно от силы, позволяющей его осуществить. Хотя, возможно, для… Читать далее