2017-04-06 9 views
1

데이터베이스 업데이트를 트리거 할 POST가 전송되도록하려는 페이지가 있습니다. 요청은 다른 사이트에서 올 것입니다.Laravel 5.3 POST 및 tokenmismatch

Route::post('update', '[email protected]'); 

요청

미가공의 단일 요소를 포함

id=12345 

(폼 데이터)

id: 12345 

I 페이지에 액세스 할 때마다,이 오류

TokenMismatchException in VerifyCsrfToken.php line 68: 

답변

1

Laravel을 사용하면 사이트 간 요청 위조 (CSRF) 공격으로부터 응용 프로그램을 보호하기가 쉽습니다. 사이트 간 요청 위조는 인증 된 사용자를 대신하여 권한이 부여되지 않은 명령이 수행되는 악의적 인 공격 유형입니다.

Laravel은 응용 프로그램에서 관리하는 각 활성 사용자 세션에 대해 CSRF "토큰"을 자동으로 생성합니다. 이 토큰은 인증 된 사용자가 실제로 응용 프로그램에 요청하는 것을 확인하는 데 사용됩니다.

응용 프로그램에서 HTML 양식을 정의 할 때마다 CSRF 보호 미들웨어가 요청을 검증 할 수 있도록 양식에 숨겨진 CSRF 토큰 필드를 포함시켜야합니다. 당신은 토큰 필드를 생성하는 csrf_field 도우미를 사용할 수 있습니다 :

<form method="POST" action="/profile"> 
    {{ csrf_field() }} 
    ... 
</form> 

후 매개 변수로 CSRF 토큰에 대한 검사뿐만 아니라, VerifyCsrfToken 미들웨어는 또한 X-CSRF 토큰 요청 헤더를 확인합니다. 당신은, 예를 들어, HTML 메타 태그에 토큰을 저장할 수 :

<meta name="csrf-token" content="{{ csrf_token() }}"> 

을 그런 다음 메타 태그를 만든 후에, 당신은 jQuery를 같은 라이브러리가 자동으로 모든 요청 헤더에 토큰을 추가 지시 할 수 있습니다. 이것은 당신의 AJAX 기반 응용 프로그램을 간단하고 편리하게 CSRF 보호 기능을 제공 :

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 

Reference

참고 : 파일 VerifyCsrfToken.php을 열고처럼 URL을 통과, CSRF 검증에서 일부 URI의이 project/app/Http/Middleware로 이동 제외하려면 :

protected $except = [ 
    '/api/authuser', 
]; 

이 배열로 전달 된 URL은 CSR의 CSR 검증에서 제외됩니다.

+0

"보낸 사람"이 보내는 것을 제어 할 권한이 없습니다. 내가 아는 것은 "id"라는 요소가 5 자리 ID로 있다는 것입니다. – aserwin

+0

참고로 csrf에서 URI를 제외하는 방법을 설명하는 섹션을 찾았습니다! 그래서, 그게 내 문제를 해결했습니다! 감사. – aserwin

+1

업데이트 된 답변을 확인하십시오. –