[php] Laravel에 게시 요청-오류-419 죄송합니다. 세션 / 419 페이지가 만료되었습니다.

라 라벨 5.7을 설치했습니다.

파일에 양식 추가 \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

파일에 추가됨 \routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

POST 요청을 보낸 후 :

419 죄송합니다. 세션이 만료되었습니다. 새로 고침하고 다시 시도하세요.

버전에서는 5.6그런 문제가 없었습니다.



답변

메이크업 아래 읽기 전에 반드시 당신은 @csrf{{ csrf_field() }}양식에
같은

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

larvel의 Session Expired 또는 419 Page Expired 오류 메시지는 csrf 토큰 확인이 실패하여 App\Http\Middleware\VerifyCsrfToken::class미들웨어가 이미 켜져 있음을 의미하기 때문에 나타납니다. 양식에서 @csrf블레이드 지시문이 이미 추가되었으므로 괜찮습니다.

확인해야 할 다른 영역은 세션입니다. csrf당신이 당신의 세션 드라이버에 문제가 발생할 수 있습니다 이러한 잘못 구성된 레디 스로, 작동 여부를 확인 할 수 있습니다 그래서 토큰 검증이 직접 세션으로 참여하고있다.

.env파일 에서 세션 드라이버 / 소프트웨어를 전환 해 볼 수 있습니다 . 지원되는 드라이버는 다음과 같습니다.

Laravel 5, Laravel 6 및 Laravel 7에서 지원되는 세션 드라이버 (Doc Link)

  • file -세션은 스토리지 / 프레임 워크 / 세션에 저장됩니다.
  • cookie -세션은 안전하고 암호화 된 쿠키에 저장됩니다.
  • database -세션은 관계형 데이터베이스에 저장됩니다.
  • memcached/ redis-세션은 이러한 빠른 캐시 기반 저장소 중 하나에 저장됩니다.
  • array -세션은 PHP 배열에 저장되며 유지되지 않습니다.

세션 드라이버를 전환 한 후 양식이 작동하는 경우 해당 특정 드라이버에 문제가있는 것입니다. 거기에서 오류를 수정하십시오.

오류가 발생하기 쉬운 시나리오

  • 아마도 파일 기반 세션은 /storage디렉토리 에 대한 권한 문제로 인해 작동하지 않을 수 있습니다 (빠른 인터넷 검색으로 솔루션을 가져올 수 있음). 또한 디렉토리에 777을 넣는 것은 결코 해결책이 아닙니다.

  • 데이터베이스 드라이버의 경우 DB 연결이 잘못되었거나 sessions테이블이 없거나 잘못 구성되었을 수 있습니다 (잘못된 구성 부분은 @Junaid Qadir의 의견에 따라 문제로 확인 됨).

  • redis/memcached 구성이 잘못되었거나 시스템의 다른 코드에 의해 동시에 조작되고 있습니다.

php artisan key:generate세션 데이터를 플러시하는 새 앱 키 를 실행 하고 생성 하는 것이 좋습니다 .

Clear Browser Cache HARD , 크롬과 파이어 폭스가 제가 기억할 수있는 것보다 더 많은 범인이라는 것을 알았습니다.

애플리케이션 키가 중요한 이유에 대해 자세히 알아보기


답변

이는 양식에 csrf가 필요하기 때문입니다. 버전 5.7에서는 @csrf로 변경했습니다.

<form action="" method="post">
    @csrf
    ...

참조 :
https://laravel.com/docs/5.7/csrf


답변

사례 1 : 127.0.01 : 8000과 같은 로컬 시스템에서 프로젝트를 실행하는 경우,

그때

SESSION_DOMAIN=.env 파일에 추가

또는 config / session.php에서 'domain' => env('SESSION_DOMAIN', ''),

그런 다음 실행 php artisan cache:clear

사례 2 : 프로젝트가 서버에서 실행 중이고 “mydomain.com”과 같은 도메인이있는 경우

SESSION_DOMAIN=mydomain.com.env 파일에 추가

또는 config / session.php에서 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

그런 다음 실행 php artisan cache:clear


답변

사용에 대해

{{ csrf_field() }} 대신에 @csrf

419 오류는 주로 csrf 토큰 문제로 인해 발생합니다.


답변

나는 Laravel 5.7을 사용합니다. 동일한 문제가 있었고 csrf 토큰이 형식에 없기 때문에

@csrf

문제를 해결


답변

주석 시도 \App\Http\Middleware\EncryptCookies::class에서 \app\Http\Kernel.php
나는 비슷한 문제를 가지고 그렇게함으로써 그것을 해결. 아마도 보안이 좋기 때문에 최선의 해결책은 아니지만 적어도 작동했습니다.

이전에는 시도했습니다.

  • 캐시 지우기
  • 새 앱 키 생성
  • 다양한 브라우저 (Chrome 70, Mozilla Firefox 57 및 IE 11)에서 내 앱 실행
  • 다른 컴퓨터에서 내 앱 실행
  • 주석 \App\Http\Middleware\VerifyCsrfToken::class\app\Http\Kernel.php
  • 주석 \Illuminate\Session\Middleware\AuthenticateSession::class\app\Http\Kernel.php
  • Laravel 업그레이드 및 다운 그레이드 (5.6 ~ 5.7 사이)

그러나 위의 어느 것도 나를 위해 일하지 않았습니다.

편집하다

여기서 제 경우는 로그인 할 때마다 새 세션 파일이 생성되고 (이전 파일은 여전히 ​​유지되지만 갑자기 잊혀졌습니다. 확인 storage/framework/sessions) 새 CSRF 토큰이 생성됩니다. 따라서 문제는 VerifyCsrfToken이 아닙니다.

@Vladd 코멘트 섹션에서 언급 한 바와 같이, 당신이해야 결코 주석하지 않습니다 \App\Http\Middleware\VerifyCsrfToken::class. 올바른 CSRF TOKEN을 서버로 보냈는지 확인해야합니다.


답변

@csrfwelcome.blade.php에서 다음 으로 변경하십시오 .<input type="hidden" name="_token" value="{{ csrf_token() }}">

그래서 당신의 코드는 다음과 같습니다.

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>