마 젠토 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.