Magento 2 - Яке використання формкі


12

Я бачу цей рядок коду всередині форми для входу. <?php echo $block->getBlockHtml('formkey'); ?>

  • В чому користь від цього?
  • Це безпечніше?
  • Це обов'язково для публікації форми?

Відповіді:


23

Клавіші форми в Magento - це засіб запобігання підробці підписів на веб-сайті , коротше кажучи, це захищає вас від людей, які намагаються розміщувати ваші форми (наприклад, додати в кошик) з інших сайтів, що представляють вас.

Це може бути небезпечно, оскільки хтось теоретично може створити власну форму та розмістити будь-яку дію контролера обробника форми у вашому магазині. Захист CSRF по суті ігнорує будь-яку публікацію, яка не може перевірити включений параметр form_key з повідомленням форми.

<?php echo $this->getBlockHtml('formkey')?>

Він каже Magento шукати блок макета з назвою "formkey" і виводити його. У Magento це, як правило, якийсь файл, який має в ньому:

<div><input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /></div>

Це вказує Magento виводити та зберігати унікальний ключ форми для сеансу користувача. Усі дії, захищені CSRF контролером Magento, перевірятимуть це, перш ніж робити щось важливе.


1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> це автоматично створить ключ форми? Мені просто потрібно повторити форму в формі, і Magento подбає про всі перевірки?
Павло

так Магенто подбає
Арджун

яка можлива ситуація, коли ключ форми не відповідає? Коли закінчується сесія клієнта чи щось? Звичайно, я маю на увазі ситуацію, окрім підроблених запитів між веб-сайтами.
Bartosz Kubicki

1
@Arjun написав у коментарі вище, що Magento подбає про перевірку формиKey. Це справедливо лише для вбудованих контролерів. Якщо ви створюєте власний контролер, або якщо сторонній контролер не очікує ключа форми, це не відповідає дійсності. У цих випадках вам потрібно перевірити це самостійно \Magento\Framework\Data\Form\FormKey\Validator.
Скотт Бюкенан

4
@ Арджун ця відповідь вводить в оману. тег посилається на magento 2, але ви
навели

21

Ви можете додати formkey за цим кодом:

<?php 
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$FormKey = $objectManager->get('Magento\Framework\Data\Form\FormKey'); 
?>
//Hidden form key field after <form> tag
<input name="form_key" type="hidden" value="<?php echo $FormKey->getFormKey();?>">

Якщо ви хочете додати ключ форми у файл phtml, тоді використовуйте direct

$ this-> getFormKey ()

<input name="form_key" type="hidden" value="<?php echo $block->getFormKey();?>">

Використання ін'єкції залежності в конструкторі класу:

protected $formKey;

public function __construct(
    \Magento\Framework\Data\Form\FormKey $formKey
) {
    $this->formKey = $formKey;
}

public function getFormKey()
{
     return $this->formKey->getFormKey();
}

Примітка. Не використовуйте менеджер об'єктів безпосередньо у файлах phtml


1
приємні рішення ..
Ракеш Єсадія

2
Не припиняйте пропонувати ObjectManagerвикористовувати в інтернеті, це не є хорошою практикою.
Влад Патру

1
@PrincePatel Ви повинні так поставити відмову, новий розробник цього не знає, і встановить у phtml, а з зразка коду у запитанні виглядає, як його потрібно використовувати у phtml
Влад Патру

1
Ніколи не використовуйте ObjectManager!
Даан ван ден Берг

1
@jafarpinjar Так, це стандарт кодування, і він перемагає мету введення залежності Перевірте цю тему для отримання додаткової інформації: magento.stackexchange.com/questions/117098/…
Prince Patel

-1

Немає необхідності в ініціалізації диспетчера об'єктів і все, що можна використовувати.

window.FORM_KEY

Frontend ви можете використовувати:

$block->getKey()

Сподіваюся, це допомагає!

Дякую


2
Це доступно лише в
бекенді

Не впевнений у цьому, але я оновив відповідь і для фронтальних.
Капіль Ядав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.