Magento 2 - A che serve formkey


12

Vedo questa riga di codice all'interno del modulo di accesso. <?php echo $block->getBlockHtml('formkey'); ?>

  • A cosa serve?
  • È più sicuro?
  • È un must per il modulo post?

Risposte:


23

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.


1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> questo genererà automaticamente la chiave del modulo? Devo solo fare eco al formkey in un modulo e Magento si occuperà di tutto il controllo?
Paolo,

sì, il magento se ne occuperà
Arjun,

qual è la situazione possibile quando la chiave del modulo non corrisponde? Quando scade la sessione del cliente o qualcosa del genere? Ovviamente intendo la situazione a parte la falsificazione delle richieste tra siti.
Bartosz Kubicki,

1
@Arjun ha scritto in un commento sopra che Magento si occuperà di controllare il formKey. Questo vale solo per i controller integrati. Se stai creando il tuo controller o se è un controller di terze parti che non si aspetta la chiave del modulo, questo non è vero. In questi casi è necessario verificarlo da soli utilizzando \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan,

4
@Arjun questa risposta è fuorviante. il tag si riferisce a magento 2 ma hai dato un esempio per magento 1
theSeeker

21

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


1
belle soluzioni ..
Rakesh Jesadiya,

2
Smetti di suggerire l' ObjectManageruso in frontend questa non è una buona pratica.
Vlad Patru,

1
@PrincePatel Dovresti mettere una dichiarazione di non responsabilità del genere, un nuovo sviluppatore non lo saprebbe e si imposterà in phtml e dall'esempio di codice nella domanda sembra che debba essere usato in phtml
Vlad Patru

1
Non usare mai ObjectManager!
Daan van den Bergh,

1
@jafarpinjar Sì, è uno standard di codifica e vanifica lo scopo dell'iniezione di dipendenze. Controlla questo thread per maggiori informazioni: magento.stackexchange.com/questions/117098/…
Prince Patel,

-1

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


2
Questo è disponibile solo nel backend
Alex Dinca,

Non ne sono sicuro, ma ho aggiornato anche la risposta per il front-end.
Kapil Yadav,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.