Як отримати ключ форми в 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 – основи їх використання.
Дякуємо, що читаєте нас!