Magento 2 - Какая польза от keykey

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 на вывод и сохранение уникального ключа формы для сеанса пользователя. Все действия контроллера Magento, защищенные CSRF, проверят это, прежде чем делать что-либо ценное.

Арджун
источник
1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> это автоматически сгенерирует ключ формы? Мне просто нужно повторить форму в форме, и Magento позаботится обо всей проверке?
Пол
да magento позаботится
Арджун
Какова возможная ситуация, когда ключ формы не совпадает? Когда сессия клиента истекает или что-то? Конечно, я имею в виду ситуацию, кроме подделки межсайтовых запросов.
Бартош Кубицкий
1
@Arjun написал в комментарии выше, что Magento позаботится о проверке formKey. Это верно только для встроенных контроллеров. Если вы создаете свой собственный контроллер, или если это сторонний контроллер, который не ожидает ключ формы, то это не так. В этих случаях вам нужно проверить это самостоятельно \Magento\Framework\Data\Form\FormKey\Validator.
Скотт Бьюкенен
4
@ Арджун этот ответ вводит в заблуждение. тег относится к magento 2, но вы привели пример для magento 1
theSeeker
21

Вы можете добавить форму ключом по этому коду:

<?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, используйте прямой

$ This-> getFormKey ()

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

Использование Dependency Injection в вашем конструкторе классов:

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 Да, это стандарт кодирования, и он побеждает цель внедрения зависимостей. Проверьте эту ветку
Prince Patel
-1

Нет необходимости инициализировать диспетчер объектов и все, что вы можете использовать.

window.FORM_KEY

Фронтенд вы можете использовать:

$block->getKey()

Надеюсь это поможет!

Благодарность

Капил Ядав
источник
2
Это доступно только в
бэкэнде
Не уверен насчет этого, но я обновил ответ и для front-end.
Капил Ядав