Magento 2 - Formkey kullanımı nedir


12

Giriş kodunun içinde bu kod satırını görüyorum. <?php echo $block->getBlockHtml('formkey'); ?>

  • Bunun kullanımı nedir?
  • Daha güvenli mi?
  • Form yazısı için şart mı?

Yanıtlar:


23

Magento'daki form anahtarları , Siteler Arası İstek Sahteciliğine karşı önlemenin bir yoludur, kısacası, sizin gibi poz veren diğer sitelerden formlarınıza (sepete ekle gibi) posta göndermeye çalışan kişilerden sizi güvende tutmaktır.

Bu tehlikeli olabilir çünkü birisi teorik olarak kendi formunu oluşturabilir ve mağazanızdaki herhangi bir form işleyicisi denetleyici eylemine gönderebilir. CSRF koruması, form formuyla birlikte verilen form_key parametresini denetleyemeyen tüm postaları yok sayar.

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

Magento'ya "formkey" adında bir yerleşim bloğu aramasını ve çıktısını almasını söyler. Magento'da bu genellikle içinde bulunan bazı dosyalardır:

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

Bu, Magento'ya bir kullanıcı oturumu için benzersiz bir form anahtarı çıkışı ve saklama talimatı verir. CSRF korumalı tüm Magento denetleyici eylemleri, değerli bir şey yapmadan önce bunu doğrular.


1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> bu otomatik olarak form anahtarını oluşturur mu? Formkey'i bir formda yankılamam gerekiyor ve Magento tüm kontrollerle ilgilenecek mi?
Paul

evet magento ilgilenecek
Arjun

form anahtarı eşleşmediğinde olası durum nedir? Müşteri oturumunun süresi ne zaman dolar? Tabii ki siteler arası istek sahteciliği dışında durum demek.
Bartosz Kubicki

1
@Arjun bir yorumda Magento'nun formKey'i kontrol etmekle ilgileneceğini yazdı. Bu sadece yerleşik kontrolörler için geçerlidir. Kendi denetleyicinizi oluşturuyorsanız veya form anahtarını beklemeyen bir üçüncü taraf denetleyicisiyseniz, bu doğru değildir. Bu durumlarda kullanarak kendiniz kontrol etmeniz gerekir \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan

4
@Arjun bu cevap yanıltıcı. etiketi magento 2 ile ilgilidir, ancak magento 1 için bir örnek
verdiniz

21

Şu kodla formkey ekleyebilirsiniz:

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

Phtml dosyasına form anahtarı eklemek istiyorsanız doğrudan kullanın

$ This-> getFormKey ()

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

Sınıf yapıcısında Bağımlılık Enjeksiyonu kullanma:

protected $formKey;

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

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

Not: Nesne yöneticisini doğrudan phtml dosyalarında kullanma


1
güzel çözümler ..
Rakesh Jesadiya

2
Ön uçta ObjectManagerkullanmayı önermeyi bırakın bu iyi bir uygulama değil.
Vlad Patru

1
@PrincePatel Böyle bir sorumluluk reddi beyan etmelisiniz, yeni bir geliştirici bunu bilmiyor ve phtml'de ayarlanacak ve sorudaki kod örneğinden phtml'de kullanılması gerekiyor gibi görünüyor
Vlad Patru

1
ObjectManager'ı hiç kullanma!
Daan van den Bergh

1
@jafarpinjar Evet bu bir kodlama standardı ve bağımlılık enjeksiyonunun amacını yeniyor Daha fazla bilgi için bu konuyu kontrol edin: magento.stackexchange.com/questions/117098/…
Prince Patel

-1

Nesne yöneticisini başlatmanıza gerek yoktur ve hepsini kullanabilirsiniz.

window.FORM_KEY

Kullanabileceğiniz ön uç:

$block->getKey()

Bu yardımcı olur umarım!

Teşekkürler


2
Bu sadece arka uçta mevcuttur
Alex Dinca

Bundan emin değilim, Ama ön uç için de cevabı güncelledim.
Kapil Yadav
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.