Magento 2 - Quelle est l'utilisation de formkey


12

Je vois cette ligne de code dans le formulaire de connexion. <?php echo $block->getBlockHtml('formkey'); ?>

  • Quelle en est l'utilité?
  • Est-ce plus sûr?
  • Est-ce un must pour le formulaire post?

Réponses:


23

Les clés de formulaire dans Magento sont un moyen de prévenir la contrefaçon de demande intersite , en bref, c'est pour vous protéger des personnes qui tentent de poster sur vos formulaires (comme ajouter au panier) d'autres sites se faisant passer pour vous.

Cela peut être dangereux car quelqu'un pourrait théoriquement créer son propre formulaire et le publier dans n'importe quelle action de contrôleur de gestionnaire de formulaire dans votre magasin. La protection CSRF ignore essentiellement toute publication qui échoue à la vérification du paramètre form_key inclus avec la publication de formulaire.

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

Il indique à Magento de rechercher un bloc de mise en page avec le nom "formkey" et de le sortir. Dans Magento, c'est généralement un fichier qui contient ceci:

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

Cela demande à Magento de générer et de stocker une clé de formulaire unique pour une session utilisateur. Toutes les actions du contrôleur Magento protégées par CSRF le vérifieront avant de faire quoi que ce soit de valeur.


1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> cela générera automatiquement la clé du formulaire? J'ai juste besoin de faire écho au formulaire dans un formulaire et Magento se chargera de toutes les vérifications?
Paul

oui magento s'en chargera
Arjun

quelle est la situation possible lorsque la clé du formulaire ne correspond pas? Lorsque la session client expire ou quelque chose? Bien sûr, je veux dire la situation en dehors de la contrefaçon de demande intersite.
Bartosz Kubicki

1
@Arjun a écrit dans un commentaire ci-dessus que Magento se chargera de vérifier le formKey. Cela n'est vrai que pour les contrôleurs intégrés. Si vous créez votre propre contrôleur, ou s'il s'agit d'un contrôleur tiers qui n'attend pas la clé de formulaire, ce n'est pas vrai. Dans ces cas, vous devez le vérifier vous-même en utilisant \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan

4
@Arjun cette réponse est trompeuse. le tag fait référence à magento 2 mais vous avez donné un exemple pour magento 1
theSeeker

21

Vous pouvez ajouter formkey par ce code:

<?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 vous souhaitez ajouter une clé de formulaire dans un fichier phtml, utilisez directement

$ this-> getFormKey ()

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

Utilisation de l'injection de dépendance dans votre constructeur de classe:

protected $formKey;

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

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

Remarque: N'utilisez pas le gestionnaire d'objets directement dans les fichiers phtml


1
belles solutions ..
Rakesh Jesadiya

2
Arrêtez de suggérer une ObjectManagerutilisation en frontend ce n'est pas une bonne pratique.
Vlad Patru

1
@PrincePatel Vous devriez mettre une clause de non-responsabilité comme ça, un nouveau développeur ne le saurait pas et définira en phtml et à partir de l'exemple de code dans la question, il semble qu'il doit être utilisé en phtml
Vlad Patru

1
N'utilisez jamais ObjectManager!
Daan van den Bergh

1
@jafarpinjar Oui, c'est un standard de codage et il va à l'encontre du but de l'injection de dépendances Consultez ce fil pour plus d'informations: magento.stackexchange.com/questions/117098/…
Prince Patel

-1

Il n'est pas nécessaire d'initialiser le gestionnaire d'objets et tout ce que vous pouvez utiliser.

window.FORM_KEY

Frontend, vous pouvez utiliser:

$block->getKey()

J'espère que cela t'aides!

Merci


2
Ceci n'est disponible que dans le backend
Alex Dinca

Je n'en suis pas sûr, mais j'ai également mis à jour la réponse pour le front-end.
Kapil Yadav
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.