2013-02-23 4 views
11

Symfony2 양식을 작성하여 요청에 바인딩했습니다. 나머지 양식을 진행하기 전에 CSRF 토큰이 유효한지 유효하지 않은지를 명시 적으로 확인해야합니다.Symfony2에서 제공된 CSRF 토큰이 유효하지 않은지 어떻게 확인할 수 있습니까?

$form['_token']->isValid()OutOfBoundsException "자식 _ 토큰 존재하지 않음"메시지가 표시됩니다.

렌더링 된 양식에 _token 필드가 있는지 확인할 수 있습니다. CSRF 값이 유효하지 않은 경우 $form->isValid()은 false를 반환합니다.

무엇이 여기에 있습니까?


업데이트 1 :

컨트롤러 (부분) :

private function buildTestForm() { 
    $form = $this->createFormBuilder() 
      ->add('name','text') 
      ->getForm(); 
    return $form; 
} 

/** 
* @Route("/test/show_form", name="test.form.show") 
* @Method("GET") 
*/ 
public function showFormTest() 
{ 
    $form = $this->buildTestForm(); 
    return $this->render('TestBundle::form_test.html.twig', array('form' => $form->createView())); 
} 

/** 
* @Route("/test/submit_form", name="test.form.submit") 
* @Method("POST") 
*/ 
public function formTest() 
{ 
    $form = $this->buildTestForm(); 
    $form->bind($this->getRequest()); 
    if ($form['_token']->isValid()) { 
     return new Response('_token is valid'); 
    } else { 
     return new Response('_token is invalid'); 
    } 
} 

템플릿

{# Twig template #} 
<form action="{{ path('test.form.submit') }}" method="post" {{ form_enctype(form) }}> 
    {{ form_widget(form) }} 
    <input type="submit" name="go" value="Test Form" /> 
</form> 
+0

적어도 양식 코드가 누락되었습니다. – mpm

+0

@mpm, true - 이제 문제를 재현 할 수있는 전체 코드가 추가되었습니다. –

+0

CSRF 토큰 유효성 검사가 자동으로 수행됩니다. http://symfony.com/doc/current/book/forms.html#csrf-protection –

답변

10

토큰 수동으로 CSRF 확인하는 문서화 방법은 없습니다. Symfony는 자동으로이 토큰의 존재와 정확성을 검증합니다. http://symfony.com/doc/current/book/forms.html#csrf-protection

는 그러나, CSRF 제공자가 :

http://api.symfony.com/2.0/Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.html

http://api.symfony.com/master/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.html

당신은을 사용하여 CSRF 토큰을 생성 할 수 있습니다 CSRF 보호를 제공 할

마크 클래스 수 메소드 generateCsrfToken(). 이 방법을 사용하면 은 CSRF 공격에 대해 보안을 유지해야하는 페이지에 고유 한 값을 전달해야합니다. 이 값은 반드시 의 비밀 일 필요는 없습니다. 이 인터페이스의 구현은 더 많은 비밀 정보를 추가 할 책임이 있습니다.

CSRF 공격에 대한 양식 제출을 보호하려면 이 "의도"문자열을 제공 할 수 있습니다. 이 방법을 사용하면 양식은 양식을 처리하도록 설계된 페이지, 즉 isCsrfTokenValid()를 사용하여 CSRF 토큰 의 유효성을 검사하기 위해 동일한 의도 문자열을 사용하는 페이지에만 바인딩 할 수 있습니다.

그런 다음 $을 토큰 CSRF 토큰 문자열을 생성 할 때 의도가 사용

public Boolean isCsrfTokenValid(string $intention, string $token) 

Validates a CSRF token. 

매개 변수 문자열 $ 의도를 사용할 수있는이

$csrf = $this->get('form.csrf_provider'); 

사용과 같은 공급자를 검색 할 수 있습니다 브라우저가 제공 한 토큰

리턴 값 부울 브라우저가 제공하는 토큰이 올바른지 여부

양식에 사용 된 의도 문자열을 찾아야합니다. SO에

일부 흥미로운 게시물 :

Symfony CSRF and Ajax

Symfony2 links with CSRF token

+3

Symfony 2.4부터 사용되지 않으므로 대신''''security.csrf.token_manager'''를 사용하십시오. http://api.symfony.com/2.7/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.html –

0

나는이 확실하지 오전하지만 매핑되지 않은 필드에 검증을 시도 있습니다

또한
$violations = $this->get('validator')->validatePropertyValue($entity, '_token', $form['_token']); 
if (count($violations)) { 
    // the property value is not valid 
} 
9

예술 작품에 대해 의도를 지정할 수 있습니다.

나뭇 가지 :

<form method="post"> 
    <input type="text" name="form_name[field]" value="" /> 
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('form_name') }}"> 
</form> 

PHP :

$token = $request->request->get('_csrf_token'); 
$csrf_token = new CsrfToken('form_name', $token); 
var_dump($this->get('security.csrf.token_manager')->isTokenValid($csrf_token)); 

여부 :

나뭇 가지 :

<form method="post"> 
    <input type="text" name="field" value="" /> 
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('') }}"> 
</form> 

PHP :

$token = $request->request->get('_csrf_token'); 
$csrf_token = new CsrfToken('', $token); 
var_dump($this->get('security.csrf.token_manager')->isTokenValid($csrf_token)); 
+0

아약스 요청으로 토큰을 다시 생성해야합니까? – danidacar

+0

아약스는 동일합니다. – user3746259

+0

아약스에서 토큰을 재생성하고 입력 값을 업데이트 할 수 있습니다. 'public function tokenAction ($ intention) {$ csrf = $ this-> get ('security.csrf.token_manager'); $ token = $ csrf-> refreshToken ($ intention); 새 응답 ($ 토큰)을 반환하십시오. }' –

관련 문제