2017-09-20 2 views
1

나는 FOS 사용자 번들과 함께 Symfony 3.1을 사용하고 있습니다.Symfony 3.1 CSRF 토큰이 로그인 양식에 유효하지 않습니다.

나는 로그인에 대해 "CSRF 유효하지 않은 토큰"메시지가 나는 첫번째 요청에, 내가 토큰을 얻을 것으로 나타났습니다 (시크릿 모드에서) 내가 로그인 처음으로

을 형성 얻을. 그런 다음 페이지를 새로 고치고 다른 페이지를 얻습니다. 그때부터, 나는 동일한 토큰을 얻는다 (그리고 올바르게 작동한다). 예를 들면 다음과 같습니다.

1st request: maJl7bBRR0iuOX4A96cOxrsLdklBIxz3mCP7fSMGqQY 
2nd request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 
3rd request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 
4th request: q21SVH98tbMLeRIypv2aTn0xBDXJ1khrcL8fIMOU4Y8 

두 번 테스트 한 결과 동일한 동작을 나타 냈습니다. 그것이 첫 번째 실패 후

<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"> 

: 형태의 CSRF 입력은 다음과 같이 생성됩니다

Cache-Control:no-cache 

: 때문에 헤더의 브라우저 캐시 문제가 될 것 같지 않습니다

시간이 다 됐습니다. (두 번째 csrf 토큰이 제대로 작동합니다)

CSRF 토큰으로 인해 처음으로 로그인 할 때 유효성을 검사하지 않으려합니다. 내가 위에서 언급 한 것의 se. CSRF 보호를 제거하는 것은 해결책이 아닙니다.

감사합니다.

UPDATE가 나는 문제가 아니라 솔루션을 발견했다. 프로젝트는 MySQL에 세션 데이터를 저장합니다. 처음 액세스 할 때 데이터를 데이터베이스에 삽입하지는 않지만 두 번째는 데이터를 삽입합니다. 데이터는 $ _SESSION에 있지만 처음에는 MySQL에 저장되지 않았기 때문에 csrf 토큰이 손실됩니다 (이 How to show the last queries executed on MySQL? 덕분에이 로깅 쿼리가 앱에서 생성 된 것으로 나타났습니다).

세션을 파일에 저장하면 정상적으로 작동합니다. 다른 서버에 여러 앱 인스턴스가 있기 때문에 이는 해결책이 아닙니다.

답변

0

문제는 거의 모든 응용 프로그램에 사용되는 서비스, 어떤 이유로 PDO 세션 처리기가 설정할 수 없습니다 원인 이는

$session = new Session(); 

가 있다고했다.

용액 서비스

public function __construct(..., Session $session) 

에 세션을 주입하고 service.yml에

- '@session' 
처럼 주입했다
관련 문제