Magento 2 - ¿Cuál es el uso de formkey

12

Veo esta línea de código dentro del formulario de inicio de sesión. <?php echo $block->getBlockHtml('formkey'); ?>

  • ¿Cuál es el uso de ello?
  • ¿Es más seguro?
  • ¿Es imprescindible para la publicación de formularios?
Pablo
fuente

Respuestas:

23

Las claves de formulario en Magento son un medio para prevenir la falsificación de solicitudes de sitios cruzados , en resumen, es para mantenerlo a salvo de las personas que intentan publicar en sus formularios (como agregar al carrito) desde otros sitios que se hacen pasar por usted.

Esto puede ser peligroso porque alguien teóricamente podría crear su propio formulario y publicarlo en cualquier acción de controlador de controlador de formulario en su tienda. La protección CSRF esencialmente ignora cualquier publicación que falle una verificación en el parámetro form_key incluido con la publicación del formulario.

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

Le dice a Magento que busque un bloque de diseño con el nombre "formkey" y lo muestre. En Magento, este suele ser un archivo que contiene esto:

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

Esto le indica a Magento que genere y almacene una clave de formulario única para una sesión de usuario. Todas las acciones del controlador Magento protegidas por CSRF verificarán esto antes de hacer algo de valor.

Arjun
fuente
1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> esto generará automáticamente la clave de formulario? ¿Solo necesito hacer eco de la tecla de formulario en un formulario y Magento se encargará de todas las comprobaciones?
Paul
sí magento se encargará
Arjun
¿Cuál es la situación posible cuando la clave de formulario no coincide? ¿Cuándo caduca la sesión del cliente o algo así? Por supuesto, me refiero a la situación aparte de la falsificación de solicitudes de sitios cruzados.
Bartosz Kubicki
1
@Arjun escribió en un comentario anterior que Magento se encargará de verificar el formularioKey. Esto solo es cierto para los controladores integrados. Si está creando su propio controlador, o si es un controlador de terceros que no espera la clave de formulario, entonces esto no es cierto. En estos casos, debe verificarlo usted mismo usando \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan
44
@Arjun esta respuesta es engañosa. la etiqueta se refiere a magento 2, sin embargo, ha dado un ejemplo para magento 1
theSeeker
21

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

Si desea agregar la clave de formulario en el archivo phtml, use direct

$ this-> getFormKey ()

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

Usando la inyección de dependencia en el constructor de tu clase:

protected $formKey;

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

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

Nota: No use el administrador de objetos directamente en archivos phtml

Príncipe Patel
fuente
1
buenas soluciones ..
Rakesh Jesadiya
2
Deje de sugerir su ObjectManageruso en la interfaz, esto no es una buena práctica.
Vlad Patru
1
@PrincePatel Deberías poner un descargo de responsabilidad como ese, un nuevo desarrollador no sabría esto y lo configurará en phtml y, según el ejemplo de código en la pregunta, parece que debe usarse en phtml
Vlad Patru
1
¡No uses ObjectManager nunca!
Daan van den Bergh
1
@jafarpinjar Sí, es un estándar de codificación y anula el propósito de la inyección de dependencia. Consulte este hilo para obtener más información: magento.stackexchange.com/questions/117098/…
Prince Patel
-1

No hay necesidad de inicializar el administrador de objetos y todo lo que puede usar.

window.FORM_KEY

Frontend puede usar:

$block->getKey()

¡Espero que esto ayude!

Gracias

Kapil Yadav
fuente
2
Esto solo está disponible en el backend
Alex Dinca
No estoy seguro, pero también he actualizado la respuesta para el front-end.
Kapil Yadav