“비 활동으로 인해 페이지가 만료되었습니다.”-Laravel 5.5


111

내 등록 페이지는 양식에 CsrfToken ( {{ csrf_field() }})이 있는 양식을 올바르게 표시합니다 .

HTML 양식

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

사용자를 위해 내장 인증을 사용하고 있습니다. 경로 및 리디렉션을 제외하고는 아무것도 변경하지 않았습니다.

양식을 제출할 때 (다시로드 한 직후에도) 비활성으로 인해 페이지가 만료 되었다는 메시지 가 표시됩니다. 새로 고침하고 다시 시도하세요. 오류.

나는 아주 작은 것을 놓치고 있습니다. 그러나 그것이 무엇인지 확실하지 않습니다. 도움이 필요하세요?

최신 정보

문제를 발견했습니다. 세션 드라이버가 배열로 설정되었습니다. 파일로 변경했으며 오류는 이제 사라졌습니다. 하지만 어레이를 사용하면 무엇이 문제입니까?


storage_path가 쓰기 가능하지 않은 것과 관련이있을 수 있습니다. 파일 기반 세션을 사용하는 경우 여기에 토큰에 관한 세션 데이터를 저장합니다.
Devon

1
문제를 발견했습니다. 세션 드라이버가로 설정되었습니다 array. 파일로 변경했으며 오류는 이제 사라졌습니다. 하지만 어레이를 사용하면 무엇이 문제입니까?
Sougata Bose


1
새 버전의 laravel의 경우 @csrf를 사용하여 문제를 해결하십시오.
Vuong Tran

답변:


164

검색에서 직접이 답변 에 도달 {{ csrf_field() }}하는 경우 OP 와 같이 양식에 csrf 토큰을 이미 추가했는지 확인하십시오 .


세션 드라이버를 파일로 설정 한 경우 :

storage_path가 쓰기 가능하지 않은 것과 관련이있을 수 있습니다. 파일 기반 세션을 사용하는 경우 여기에 토큰에 관한 세션 데이터를 저장합니다. 다음으로 확인할 수 있습니다.is_writable(config('session.files'))


OP의 경우 세션 드라이버가 배열로 설정되었습니다. 어레이는 테스트 전용입니다. 데이터가 유지되지 않기 때문에 다음 요청에서 토큰을 비교할 수 없습니다.

어레이 드라이버는 테스트 중에 사용되며 세션에 저장된 데이터가 지속되는 것을 방지합니다.

https://laravel.com/docs/5.5/session#configuration


config / session.php 확인

마지막으로, 제가 방금 겪은 문제는 config / session.php에 세션 도메인과 보안 설정이있는 프로젝트가 있었지만 개발 사이트는 HTTPS (SSL / TLS)를 사용하지 않았습니다. 이로 인해 sessions.secure가 기본적으로 true로 설정되었으므로이 일반 오류가 발생했습니다.


3
확인. 그러나 지금은 개발 중입니다. 그래서 배열을 사용하면 왜 그 오류가 발생합니까?
Sougata Bose

@SougataBose 테스트는 개발이 아닙니다. 배열 데이터는 ... 유지되지 않습니다
데본

그래서 DOC를 제대로 통과해야하는 이유입니다 .. :)
Sougata Bose

내 문제가 해결되지 않았습니다. 나는 진정으로 기본을했다. 하지만 사용자 지정 공급자 및 서비스를 사용하고 있습니다. 컨트롤러 메서드를 호출하면 문제가 없지만 post request로 호출 한 컨트롤러에서 서비스 메서드를 실행하면 문제가 나타납니다!
Behnam 아 지미

1
세션과 비슷한 문제가 있었지만 테스트와 관련하여. Carbon::setTestNow($time);테스트에서 사용할 때 Carbon::setTestNow();나중에 사용하여 지우지 않았습니다 .
riotCode

77

Laravel 5.5에서 같은 문제가 발생했습니다. 제 경우에는 경로를 GET에서 POST로 변경 한 후에 발생했습니다. 문제는 POST로 전환 할 때 CSRF 토큰을 전달하는 것을 잊었 기 때문입니다.

다음을 호출하여 양식에 CSRF 토큰을 게시 할 수 있습니다.

 {{ csrf_field() }}

또는 app / Http / Middleware / VerifyCsrfToken.php에서 경로를 제외하십시오.

 protected $except = [
        'your/route'
    ];

2
csrf_field()형태로 존재합니다. 허용되는 답변은 문제를 설명합니다. 감사.
Sougata Bose

1
제 경우에는 타사에서 POST를 받았기 때문에 csrf_field ()를 추가하는 것은 옵션이 아닙니다. CSRF가 제 경우에는 요인이 아니기 때문에이 경로에 예외를 추가하면 문제가 해결되었습니다. 감사.
Fábio Duque Silva

내 문제가 해결되지 않았습니다. 나는 진정으로 기본을했다. 하지만 사용자 지정 공급자 및 서비스를 사용하고 있습니다. 컨트롤러 메서드를 호출하면 문제가 없지만 post request로 호출 한 컨트롤러에서 서비스 메서드를 실행하면 문제가 나타납니다!
Behnam Azimi

1
CSRF 확인을 비활성화하지 마십시오! 보호하는 것이 매우 중요합니다. 토큰을 올바르게 전송하고 사용자를 대신하여 작업을 제출할 수있는 악성 자바 스크립트로부터 로그인 한 사용자를 보호하는 방법을 알아보세요.
Devon



6

내 사건은로 해결되었고 SESSION_DOMAIN, 내 로컬 컴퓨터에서로 설정해야했습니다 xxx.localhost. 그것은 생산과 충돌의 원인이 된 SESSION_DOMAIN, xxx.comsession.php의 설정 파일에 직접 설정되었다.


사용중인 세션 드라이버는 무엇입니까? file또는 cookie?
KeitelDOG

4

일부 정보는 개발중인 이전 버전의 laravel과 관련된 쿠키에 저장됩니다. 따라서 다른 버전에서 생성 된 csrf 생성 토큰과 충돌합니다. 쿠키를 지우고 시도하십시오.


<input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">생성 된 html에서 코드의 종류 를 볼 수 있었습니까?
Suresh Velusamy

저기있어. 문제를 발견했습니다. 세션 드라이버가 배열로 설정되었습니다. 파일로 변경했으며 오류는 이제 사라졌습니다.
Sougata Bose

4

여전히 문제가 있고 도움이되지 않는 사람들을 위해. php.ini mbstring.func_overload 매개 변수에주의하십시오. 0으로 설정되어야합니다. 그리고 mbstring.internal_encoding은 UTF-8로 설정됩니다. 제 경우에는 그것이 문제였습니다.


대단히 감사합니다! 당신의 대답은) 충돌에서 내 머리를 저장
Rustembek Kaliyev에게

3

저장 권한을 변경했는데 오류가 사라졌습니다. 허가 부족이 문제인 것 같았다.

sudo chmod -R 775 storage/

2
이러한 개방 권한을 재귀 적으로 사용하려면주의하십시오. 파일의 경우 775에 대해 적극 권장합니다. 디렉토리의 경우 755, 파일의 경우 644가 표준입니다.
Devon

3

@csrf양식에 추가 하고 VerifyCsrfToken.php로 이동하십시오.

app-> Http-> Middleware-> VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];

1

제 경우에는 사이트가 서버에서는 괜찮 았지만 로컬에서는 그렇지 않았습니다. 그런 다음 보안 웹 사이트에서 작업하고 있었던 것을 기억합니다.
따라서 config.session.php 파일에서 secure 변수를 false로 설정하십시오.

'secure' => env('SESSION_SECURE_COOKIE', false),

0

여러 하위 도메인이있는 앱이 있었고 세션 쿠키가 그 사이의 문제였습니다. 쿠키를 지우면 문제가 해결되었습니다.

또한 .env 파일 SESSION_DOMAIN에서 설정해보십시오 . 탐색중인 정확한 하위 도메인을 사용하십시오.


0

웹 서버에 올바른 시스템 시간이 있는지 확인하십시오. 제 경우에는 방랑 기계가 미래에 있었기 때문에 (Jan 26 14:08:26 UTC 2226) 물론 제 브라우저 세션 쿠키의 시간이 약 200 년 전에 만료되었습니다.


0

mbstring.func_overload = 2 설정

그것은 나를 도왔다


0

이 오류를 방지하기 위해 두 가지 해결책을 찾았습니다. 1) protected $ except = [ '/ yourroute'] 가능한 비활성화 csrf 토큰 검사를 정의 된 루트에서 추가하여. 2) 커널의 보호 된 미들웨어 그룹의 \ App \ Http \ Middleware \ VerifyCsrfToken :: class 줄에 주석을 추가하십시오.


0

나는 같은 문제가 있었지만 문제는 프레임 워크가 아니라 브라우저에 있습니다. 이유는 모르겠지만 Google 크롬은 자동으로 쿠키를 차단합니다. 쿠키 허용 후 문제가 해결되었습니다.


0

짧은 답변

에 대한 경로 항목 추가 register에를app/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

다음 명령으로 캐시와 캐시 경로를 지 웁니다.

php artisan cache:clear && php artisan route:clear

세부

Laravel 사이트에 액세스 할 때마다 세션이 시작되지 않았더라도 토큰이 생성됩니다. 그런 다음 각 요청에서이 토큰 (쿠키에 저장 됨)은 파일 의 SESSION_LIFETIME필드에 설정된 만료 시간에 대해 유효성이 검사 config/session.php됩니다.

만료 시간 이상 사이트를 열어두고 요청을 시도하면이 토큰이 평가되고 만료 오류가 반환됩니다. 따라서 인증 된 사용자의 기능 (예 : 등록 또는 로그인) 외부에있는 양식에서이 유효성 검사를 건너 뛰려면에서 except 경로를 추가 할 수 있습니다 app/Http/Middleware/VerifyCsrfToken.php.


1
해당 페이지가 사용자 입력을 처리하는 경우 CSRF 검사를 거쳐야합니다.
Sougata Bose

이 경우에 나는 구글 reCAPTCHA를 같은 보안 문자 검증 사용하는 것이 가장 좋습니다 생각, 사실 @SougataBose
JC 그라

0

과거에 프로젝트를 테스트하고 있기 때문에 여러 번 발생합니다.


0

해결책:

시크릿 새 탭을 사용한 다음 다시 테스트하십시오.

이유:

제 경우에는 다른 사용자가 내 관리자 패널로 로그인했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.