Risposte:
Le chiavi dei moduli in Magento sono un mezzo per prevenire la contraffazione di richieste di siti incrociati , in breve, è per proteggerti dalle persone che cercano di pubblicare nei tuoi moduli (come aggiungi al carrello) da altri siti in posa come te.
Questo può essere pericoloso perché in teoria qualcuno potrebbe creare il proprio modulo e pubblicarlo in qualsiasi azione del controller del gestore di moduli nel tuo negozio. La protezione CSRF essenzialmente ignora qualsiasi post che non supera un controllo sul parametro form_key incluso con il post del modulo.
<?php echo $this->getBlockHtml('formkey')?>
Indica a Magento di cercare un blocco di layout con il nome "formkey" e di produrlo. In Magento questo è di solito un file che contiene questo:
<div><input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>" /></div>
Ciò indica a Magento di produrre e memorizzare una chiave di modulo univoca per una sessione utente. Tutte le azioni del controller Magento protette da CSRF verificheranno contro questo prima di fare qualcosa di valore.
\Magento\Framework\Data\Form\FormKey\Validator
.
Puoi aggiungere formkey con questo codice:
<?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 si desidera aggiungere la chiave del modulo nel file phtml, utilizzare direttamente
$ This-> getFormKey ()
<input name="form_key" type="hidden" value="<?php echo $block->getFormKey();?>">
Utilizzo di Dependency Injection nel costruttore della classe:
protected $formKey;
public function __construct(
\Magento\Framework\Data\Form\FormKey $formKey
) {
$this->formKey = $formKey;
}
public function getFormKey()
{
return $this->formKey->getFormKey();
}
Nota: non utilizzare la gestione oggetti direttamente nei file phtml
ObjectManager
uso in frontend questa non è una buona pratica.
Non è necessario inizializzare il gestore oggetti e tutto ciò che è possibile utilizzare.
window.FORM_KEY
Frontend puoi usare:
$block->getKey()
Spero che sia di aiuto!
Grazie