마 젠토 2-formkey의 사용법


12

로그인 양식 안에이 코드 줄이 있습니다. <?php echo $block->getBlockHtml('formkey'); ?>

  • 그것의 사용은 무엇입니까?
  • 더 안전합니까?
  • 양식 게시에 반드시 필요한가요?

답변:


23

Magento의 양식 키Cross Site Request Forgery 를 방지하는 수단입니다 . 간단히 말해서, 다른 사이트에서 귀하의 양식에 게시하려는 사람들 (예 : 장바구니에 추가)을 안전하게 지키는 것입니다.

누군가 이론적으로 자체 양식을 작성하고 상점의 모든 양식 핸들러 제어기 조치에 게시 할 수 있기 때문에 위험 할 수 있습니다. CSRF 보호는 기본적으로 form post와 함께 포함 된 form_key 매개 변수를 검사하지 못한 모든 post를 무시합니다.

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

Magento에게 "formkey"라는 이름의 레이아웃 블록을 찾아 출력하도록 지시합니다. 마 젠토에서 이것은 보통 이것 안에있는 파일입니다 :

<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가 모든 검사를 처리합니까?
Paul

네 마 젠토가 돌봐 줄 것입니다
Arjun

양식 키가 일치하지 않는 상황은 무엇입니까? 고객 세션이 만료 될 때 물론 크로스 사이트 요청 위조를 제외한 상황을 의미합니다.
Bartosz Kubicki

1
@Arjun은 위의 주석에서 Magento가 formKey 검사를 담당 할 것이라고 썼습니다. 내장 컨트롤러에만 해당됩니다. 자체 컨트롤러를 만들거나 폼 키를 기대하지 않는 타사 컨트롤러 인 경우에는 해당되지 않습니다. 이 경우을 사용하여 직접 확인해야합니다 \Magento\Framework\Data\Form\FormKey\Validator.
Scott Buchanan

4
@Arjun이 답변은 잘못된 것입니다. 태그는 magento 2를 참조하지만 magento 1
theSeeker

21

이 코드로 폼키를 추가 할 수 있습니다 :

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

클래스 생성자에서 Dependency Injection 사용 :

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
@PrincePatel 당신은 그런 면책 조항을 넣어야합니다. 새로운 개발자는 이것을 알지 못하고 phtml로 설정하고 질문의 코드 샘플에서 phtml에서 사용해야하는 것처럼 보입니다.
Vlad Patru

1
ObjectManager를 사용하지 마십시오!
Daan van den Bergh

1
@jafarpinjar 예 코딩 표준이며 의존성 주입의 목적을 무시
Prince Patel

-1

객체 관리자를 초기화 할 필요가 없으며 모두 사용할 수 있습니다.

window.FORM_KEY

사용할 수있는 프론트 엔드 :

$block->getKey()

도움이 되었기를 바랍니다!

감사


2
이것은 백엔드에서만 가능합니다
Alex Dinca

확실하지 않지만 프론트 엔드에 대한 답변도 업데이트했습니다.
Kapil Yadav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.