Magento 2 - Was ist die Verwendung von Formkey

12

Ich sehe diese Codezeile im Anmeldeformular. <?php echo $block->getBlockHtml('formkey'); ?>

  • Was nützt es?
  • Ist es sicherer?
  • Ist es ein Muss für Formularpost?
Paul
quelle

Antworten:

23

Formularschlüssel in Magento sind ein Mittel gegen Cross Site Request Forgery , kurz gesagt, um Sie vor Leuten zu schützen, die versuchen, auf Ihren Formularen (z. B. in den Warenkorb) von anderen Sites aus zu posten, die sich als Sie ausgeben.

Dies kann gefährlich sein, da theoretisch jemand sein eigenes Formular erstellen und auf einer beliebigen Handler-Controller-Aktion in Ihrem Geschäft posten könnte. Der CSRF-Schutz ignoriert im Wesentlichen alle Posts, bei denen die Prüfung des enthaltenen form_key-Parameters mit dem Formularpost fehlschlägt.

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

Magento wird angewiesen, nach einem Layoutblock mit dem Namen "formkey" zu suchen und diesen auszugeben. In Magento ist dies normalerweise eine Datei, die folgendes enthält:

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

Dies weist Magento an, einen eindeutigen Formularschlüssel für eine Benutzersitzung auszugeben und zu speichern. Alle CSRF-geschützten Magento-Controller-Aktionen werden daraufhin überprüft, bevor etwas Wertvolles getan wird.

Arjun
quelle
1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> dies generiert automatisch den Formularschlüssel? Ich muss nur den Formularschlüssel in einem Formular ausgeben und Magento kümmert sich um alle Überprüfungen.
Paul
Ja, Magento wird sich darum kümmern
Arjun
Was ist möglich, wenn der Formularschlüssel nicht übereinstimmt? Wann läuft die Kundensitzung ab oder was? Natürlich meine ich Situation abgesehen von Cross Site Request Fälschung.
Bartosz Kubicki
1
@Arjun hat oben in einem Kommentar geschrieben, dass Magento sich um die Überprüfung des formKey kümmert. Dies gilt nur für integrierte Steuerungen. Wenn Sie einen eigenen Controller erstellen oder es sich um einen Controller eines Drittanbieters handelt, der den Formularschlüssel nicht erwartet, ist dies nicht der Fall. In diesen Fällen müssen Sie es selbst überprüfen \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan
4
@ Arjun diese Antwort ist irreführend. das tag bezieht sich auf magento 2, aber du hast ein beispiel für magento 1
theSeeker
20

Mit diesem Code können Sie einen Formularschlüssel hinzufügen:

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

Wenn Sie einen Formularschlüssel in eine HTML-Datei einfügen möchten, verwenden Sie direct

$ this-> getFormKey ()

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

Verwenden von Dependency Injection in Ihrem Klassenkonstruktor:

protected $formKey;

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

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

Hinweis: Verwenden Sie den Objektmanager nicht direkt in HTML-Dateien

Prinz Patel
quelle
1
schöne Lösungen ..
Rakesh Jesadiya
2
Hören Sie auf, die ObjectManagerVerwendung im Frontend vorzuschlagen. Dies ist keine gute Praxis.
Vlad Patru
1
@PrincePatel Du solltest einen solchen Haftungsausschluss setzen, ein neuer Entwickler würde das nicht wissen und wird in phtml einstellen und aus dem Codebeispiel in der Frage sieht es so aus, als müsste es in phtml verwendet werden
Vlad Patru
1
Verwenden Sie niemals ObjectManager!
Daan van den Bergh
1
@jafarpinjar Ja, es ist ein Kodierungsstandard, der den Zweck der Abhängigkeitsinjektion beseitigt.
Prince Patel
-1

Es ist nicht erforderlich, den Objekt-Manager zu initialisieren, und Sie können alles verwenden.

window.FORM_KEY

Frontend, das Sie verwenden können:

$block->getKey()

Hoffe das hilft!

Vielen Dank

Kapil Yadav
quelle
2
Dies ist nur im Backend verfügbar
Alex Dinca
Ich bin mir nicht sicher, aber ich habe die Antwort auch für das Front-End aktualisiert.
Kapil Yadav