Categories: Мадженто 2

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

Дякуємо, що читаєте нас!

 

Recent Posts

WordPress як Headless CMS 🧠 | практично з REST API

WordPress роками був неперевершеним "монолітом": він відповідав і за зручну адмін-панель, і за збереження даних,…

1 тиждень ago

Тандем Nginx + Apache 🤝 Як поєднати швидкість та гнучкість

У світі веб-серверів часто говорять про протистояння Nginx vs Apache. Але що, якби я сказав…

2 тижні ago

Що таке Apache HTTP Server: 📜 Надійний ветеран веб-серверів

Коли я починав свій шлях у веб-розробці, питання "який веб-сервер використовувати?" практично не стояло. Відповідь…

2 тижні ago

Що таке Nginx: чому він швидший за Apache? 🚀 | Інструкція + Конфіги

Коли мова заходить про веб-сервери, два імені завжди на слуху: Apache та Nginx. Apache —…

2 тижні ago

Знайомство з Docker для веб-розробника 🐳 | Встановлення та основи

У світі веб-розробки ми постійно стикаємося з проблемою: "А в мене на комп'ютері все працює!".…

2 тижні ago

Навіщо веб-розробнику віртуальна машина (VM) 🖥️

На зорі моєї кар'єри веб-розробника все було відносно просто: встановив локальний сервер (пам'ятаєте Denwer?), поклав…

2 тижні ago