Magento 2-フォームキーの使用とは


12

ログインフォーム内にこのコード行があります。 <?php echo $block->getBlockHtml('formkey'); ?>

  • それの使用は何ですか?
  • より安全ですか?
  • フォーム投稿に必須ですか?

回答:


23

Magentoのフォームキーは、クロスサイトリクエストフォージェリを防止する手段です。要するに、あなたになりすましている他のサイトからフォーム(カートに追加するなど)に投稿しようとする人々からあなたを守るためです。

誰かが理論的に独自のフォームを作成し、ストア内のフォームハンドラーコントローラーアクションに投稿できるため、これは危険な場合があります。CSRF保護は、フォームポストに含まれるform_keyパラメーターのチェックに失敗したポストを本質的に無視します。

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

Magentoに、「formkey」という名前のレイアウトブロックを探して出力するように指示します。Magentoでは、これは通常これを含むファイルです:

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

これにより、Magentoはユーザーセッションの一意のフォームキーを出力および保存します。CSRFで保護されたすべてのMagentoコントローラーアクションは、価値のあることを行う前にこれに対して検証します。


1
`<?php echo Mage :: getSingleton( 'core / session')-> getFormKey()?>これはフォームキーを自動生成しますか?フォームにフォームキーをエコーするだけで、Magentoがすべてのチェックを処理しますか?
ポール

はいmagentoが世話をします
Arjun

フォームキーが一致しない場合に考えられる状況は何ですか?顧客セッションの有効期限が切れるかどうか もちろん、クロスサイトリクエストフォージェリ以外の状況を意味します。
バルトシュクビッキ16

1
@Arjunは上記のコメントで、MagentoがformKeyのチェックを処理することを書きました。これは、組み込みコントローラーにのみ当てはまります。独自のコントローラーを作成している場合、またはフォームキーを必要としないサードパーティのコントローラーの場合、これは当てはまりません。これらの場合、を使用して自分で確認する必要があります\Magento\Framework\Data\Form\FormKey\Validator
スコットブキャナン

4
@Arjunこの答えは誤解を招くものです。タグはmagento 2を参照していますが、magento 1の例を示しました
-theSeeker

21

次のコードでformkeyを追加できます。

<?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ファイルにフォームキーを追加する場合は、directを使用します

$ this-> getFormKey()

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

クラスコンストラクターでの依存性注入の使用:

protected $formKey;

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

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

注:phtmlファイルでオブジェクトマネージャーを直接使用しないでください


1
素敵なソリューション..
Rakesh Jesadiya

2
ObjectManagerフロントエンドでの使用を提案するのはやめましょう。これは良い習慣ではありません。
Vlad Patru

1
あなたがそのような免責条項を入れてshoud @PrincePatel、新しい開発者は、このことを知っているだろうし、それがPHTMLで使用する必要がありますようにPHTMLで、問題のルックスのコードサンプルから設定します
ヴラドPatru

1
ObjectManagerを使用しないでください!
ダーン

1
@jafarpinjarはい、それは符号化規格だとそれは依存性注入の目的は、より多くの情報のため、このスレッドをチェックしてください敗北:magento.stackexchange.com/questions/117098/...
プリンス・パテル

-1

オブジェクトマネージャを初期化する必要はなく、すべて使用できます。

window.FORM_KEY

使用できるフロントエンド:

$block->getKey()

お役に立てれば!

ありがとう


2
これはバックエンドでのみ利用可能です
アレックスディンカ

それについてはわかりませんが、フロントエンドの回答も更新しました。
カピルヤダフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.