Magento 2 - Do czego służy formkey


12

Widzę ten wiersz kodu w formularzu logowania. <?php echo $block->getBlockHtml('formkey'); ?>

  • Jaki jest z tego pożytek?
  • Czy to jest bezpieczniejsze?
  • Czy jest to konieczne w przypadku formularzy?

Odpowiedzi:


23

Klucze formularzy w Magento zapobiegają fałszowaniu żądań między witrynami , w skrócie, mają chronić Cię przed osobami, które próbują publikować w Twoich formularzach (np. Dodaj do koszyka) z innych stron udających Ciebie.

Może to być niebezpieczne, ponieważ ktoś może teoretycznie stworzyć własną formę i opublikować dowolną akcję kontrolera modułu obsługi formularzy w twoim sklepie. Ochrona CSRF zasadniczo ignoruje każdy post, który nie przejdzie sprawdzania dołączonego parametru form_key w formularzu post.

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

Mówi Magento, aby szukał bloku układu o nazwie „formkey” i wyprowadził go. W Magento jest to zwykle jakiś plik, który ma to w sobie:

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

To instruuje Magento, aby wyprowadził i przechował unikalny klucz formularza dla sesji użytkownika. Wszystkie działania kontrolera Magento chronione przez CSRF zweryfikują to, zanim zrobią coś wartościowego.


1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> to automatycznie wygeneruje klucz formularza? Muszę tylko echo klucza formularza w formularzu, a Magento zajmie się wszystkimi sprawdzeniami?
Paul

tak, zajmie się Magento
Arjun,

jaka jest możliwa sytuacja, gdy klucz formularza nie pasuje? Kiedy sesja klienta wygasa czy coś? Oczywiście chodzi mi o sytuacje poza prośbą o fałszerstwo.
Bartosz Kubicki,

1
@Arjun napisał w komentarzu powyżej, że Magento zajmie się sprawdzeniem formKey. Dotyczy to tylko wbudowanych kontrolerów. Jeśli tworzysz własny kontroler lub jest to kontroler innej firmy, który nie oczekuje klucza formularza, nie jest to prawdą. W takich przypadkach musisz to sprawdzić samodzielnie \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan

4
@Arjun ta odpowiedź jest myląca. tag odnosi się do magento 2, ale podałeś przykład dla magento 1
theSeeker

21

Możesz dodać formkey za pomocą tego kodu:

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

Jeśli chcesz dodać klucz formularza do pliku phtml, użyj bezpośredniego

$ this-> getFormKey ()

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

Używanie wstrzykiwania zależności w konstruktorze klas:

protected $formKey;

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

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

Uwaga: Nie używaj menedżera obiektów bezpośrednio w plikach phtml


1
fajne rozwiązania ..
Rakesh Jesadiya

2
Przestań sugerować ObjectManagerużycie frontendu, to nie jest dobra praktyka.
Vlad Patru

1
@PrincePatel Powinieneś umieścić takie zastrzeżenie, nowy programista nie będzie tego wiedział i ustawi w phtml, a na podstawie próbki kodu w pytaniu wygląda na to, że należy go użyć w phtml
Vlad

1
Nigdy nie używaj ObjectManager!
Daan van den Bergh

1
@jafarpinjar Tak, jest to standard kodowania i pokonuje cel wstrzykiwania zależności Sprawdź ten wątek, aby uzyskać więcej informacji: magento.stackexchange.com/questions/117098/…
Prince Patel

-1

Nie ma potrzeby inicjowania menedżera obiektów i wszystko, czego możesz użyć.

window.FORM_KEY

Frontend, którego możesz użyć:

$block->getKey()

Mam nadzieję że to pomoże!

Dzięki


2
Jest to dostępne tylko w backendie
Alex Dinca

Nie jestem pewien, ale zaktualizowałem również odpowiedź dla frontonu.
Kapil Yadav,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.