Magento 2 - Para que serve o formkey

12

Eu vejo essa linha de código dentro do formulário de login. <?php echo $block->getBlockHtml('formkey'); ?>

  • Qual é a utilidade disso?
  • É mais seguro?
  • É uma obrigação para a postagem do formulário?
Paulo
fonte

Respostas:

23

As chaves de formulário no Magento são um meio de impedir a falsificação de solicitação entre sites . Em resumo, é para protegê-lo das pessoas que tentam postar em seus formulários (como adicionar ao carrinho) de outros sites que se apresentam como você.

Isso pode ser perigoso, porque alguém poderia teoricamente criar seu próprio formulário e publicar em qualquer ação do controlador de manipulador de formulários em sua loja. A proteção CSRF basicamente ignora qualquer publicação que falhe na verificação do parâmetro form_key incluído na publicação de formulário.

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

Ele diz ao Magento para procurar um bloco de layout com o nome "formkey" e enviá-lo. No Magento, isso geralmente é um arquivo que contém isso:

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

Isso instrui o Magento a produzir e armazenar uma chave de formulário exclusiva para uma sessão do usuário. Todas as ações do controlador Magento protegidas por CSRF serão verificadas contra isso antes de fazer qualquer coisa de valor.

Arjun
fonte
1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> isso gera automaticamente a chave do formulário? Eu só preciso ecoar a formkey de uma forma e o Magento cuidará de todas as verificações?
Paul
sim magento vai cuidar
Arjun
qual é a situação possível quando a chave do formulário não corresponde? Quando a sessão do cliente expirar ou algo assim? É claro que quero dizer situação à parte, solicitação de falsificação entre sites.
Bartosz Kubicki
1
@Arjun escreveu em um comentário acima que o Magento cuidará de verificar o formulárioKey. Isso é verdade apenas para controladores internos. Se você estiver criando seu próprio controlador ou se for um controlador de terceiros que não espera a chave do formulário, isso não é verdade. Nesses casos, você precisa verificar por conta própria \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan
4
@Arjun esta resposta é enganosa. a tag refere-se ao magento 2, mas você deu um exemplo para o magento 1
theSeeker
21

Você pode adicionar formkey por este código:

<?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();?>">

Se você deseja adicionar uma chave de formulário no arquivo phtml, use direct

$ this-> getFormKey ()

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

Usando Injeção de Dependência no seu construtor de classe:

protected $formKey;

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

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

Nota: Não use o gerenciador de objetos diretamente nos arquivos phtml

Prince Patel
fonte
1
soluções agradáveis ​​..
Rakesh Jesadiya 19/09/17
2
Pare de sugerir o ObjectManageruso no front-end. Essa não é uma boa prática.
Vlad Patru
1
@PrincePatel que deviam colocar um aviso assim, um novo desenvolvedor não sabem disso e vai pôr em phtml e da amostra de código em questão parece que precisa para ser usado em phtml
Vlad Patru
1
Nunca use o ObjectManager!
Daan van den Bergh
1
@jafarpinjar Sim, é um padrão de codificação e Ele derrota o propósito de injeção de dependência Confira esta discussão para mais informações: magento.stackexchange.com/questions/117098/...
Príncipe Patel
-1

Não há necessidade de inicializar o gerenciador de objetos e tudo, você pode usar.

window.FORM_KEY

Frontend você pode usar:

$block->getKey()

Espero que isto ajude!

obrigado

Kapil Yadav
fonte
2
Isso está disponível apenas no back
Alex Dinca
Não tenho certeza, mas também atualizei a resposta para o front-end.
Kapil Yadav 10/10