Magento 2 - Apa gunanya formkey?

12

Saya melihat baris kode ini di dalam formulir login. <?php echo $block->getBlockHtml('formkey'); ?>

  • Apa gunanya?
  • Apakah lebih aman?
  • Apakah itu suatu keharusan untuk posting bentuk?
Paul
sumber

Jawaban:

23

Kunci formulir di Magento adalah cara untuk mencegah terhadap Pemalsuan Permintaan Situs Lintas , singkatnya, itu membuat Anda aman dari orang-orang yang mencoba memposting ke formulir Anda (seperti menambahkan ke keranjang) dari situs lain yang menyamar sebagai Anda.

Ini bisa berbahaya karena seseorang secara teoritis bisa membuat formulir sendiri dan memposting ke tindakan pengendali penangan formulir di toko Anda. Perlindungan CSRF pada dasarnya mengabaikan posting yang gagal memeriksa parameter form_key yang disertakan dengan postingan form.

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

Ia memberitahu Magento untuk mencari blok tata letak dengan nama "formkey" dan menampilkannya. Di Magento ini biasanya beberapa file yang memiliki ini di dalamnya:

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

Ini menginstruksikan Magento untuk mengeluarkan dan menyimpan kunci formulir unik untuk sesi pengguna. Semua tindakan pengontrol Magento yang dilindungi CSRF akan memverifikasi ini sebelum melakukan sesuatu yang bernilai.

Arjun
sumber
1
`<? php echo Mage :: getSingleton ('core / session') -> getFormKey ()?> ini akan menghasilkan kunci form secara otomatis? Saya hanya perlu mengulangi formkey dalam bentuk dan Magento akan mengurus semua pengecekan?
Paul
ya magento akan berhati-hati
Arjun
situasi apa yang mungkin terjadi ketika kunci formulir tidak cocok? Kapan sesi pelanggan berakhir atau apa? Tentu saja maksud saya situasi selain pemalsuan permintaan lintas situs.
Bartosz Kubicki
1
@Arjun menulis dalam komentar di atas bahwa Magento akan mengurus memeriksa formKey. Ini hanya berlaku untuk pengontrol bawaan. Jika Anda membuat pengontrol Anda sendiri, atau pengontrol pihak ketiga yang tidak mengharapkan kunci formulir, maka ini tidak benar. Dalam kasus ini, Anda perlu memeriksanya sendiri menggunakan \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan
4
@Arjun jawaban ini menyesatkan. tag mengacu pada magento 2 namun Anda telah memberikan contoh untuk
magento
21

Anda dapat menambahkan formkey dengan kode ini:

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

Jika Anda ingin menambahkan kunci formulir dalam file phtml, gunakan langsung

$ this-> getFormKey ()

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

Menggunakan Injeksi Ketergantungan pada konstruktor kelas Anda:

protected $formKey;

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

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

Catatan: Jangan gunakan manajer objek secara langsung dalam file phtml

Pangeran Patel
sumber
1
solusi yang bagus ..
Rakesh Jesadiya
2
Berhenti menyarankan ObjectManagerpenggunaan di frontend ini bukan praktik yang baik.
Vlad Patru
1
@PrincePatel Anda harus meletakkan disclaimer seperti itu, pengembang baru tidak akan tahu ini dan akan mengatur dalam phtml dan dari sampel kode dalam pertanyaan sepertinya perlu digunakan dalam phtml
Vlad Patru
1
Jangan pernah menggunakan ObjectManager!
Daan van den Bergh
1
@jafarpinjar Ya itu adalah standar pengkodean dan Ia mengalahkan tujuan injeksi ketergantungan. Periksa utas ini untuk info lebih lanjut: magento.stackexchange.com/questions/117098/…
Prince Patel
-1

Tidak perlu menginisialisasi objek manager dan semuanya, Anda dapat menggunakan.

window.FORM_KEY

Frontend dapat Anda gunakan:

$block->getKey()

Semoga ini membantu!

Terima kasih

Kapil Yadav
sumber
2
Ini hanya tersedia di backend
Alex Dinca
Tidak yakin tentang itu, Tapi saya telah memperbarui jawaban untuk front-end juga.
Kapil Yadav