2016-12-14 4 views
2

anti-CSRF 메커니즘에 대한 거의 모든 문서는 CSRF 토큰이 서버 측에서 생성되어야한다고 말합니다. 그러나 그것이 필요한지 궁금합니다.서버 측에서 anti-XSRF/CSRF 토큰을 생성해야합니까?

나는이 단계에서 안티 - CSRF를 구현하려는 :

  1. 더 서버 측 생성 CSRF 토큰이 없습니다;

  2. 브라우저 측면에서 모든 AJAX 또는 양식 제출시 자바 스크립트는 임의의 문자열을 토큰으로 생성합니다. 이 토큰은 실제 AJAX 나 양식 제출이 발생하기 전에 쿠키 csrf에 기록됩니다. 토큰은 _csrf으로 매개 변수에 추가됩니다. 서버 측에서

  3. , 각 요청은 CSRF 쿠키 _csrf 제출 한 인수 를 가질 예정이다. 이 두 값이 비교됩니다. 그것들이 다르다면 그것은 CSRF 공격이라는 것을 의미합니다.

서버 측에서 CSRF 토큰을 발행 할 필요가 없습니다. 토큰은 브라우저 측에서 완전히 생성됩니다. 물론 이것은 반 CSRF를위한 것입니다. 사용자 ID의 유효성을 검사하려면 서버 측에 인증 프로세스가 있어야합니다.

CSRF에 대한 올바른 해결책이 들리지만이 접근법에 대한 문서가없는 이유는 확실하지 않습니다.

이 CSRF 방지 메커니즘에 결함이 있습니까?

답변

1

내가 아는 한, 클라이언트 측에서 anti-CSRF를 생성하고이를 쿠키에 저장하고 요청 매개 변수로 추가하여 서버가 요청을 읽을 때 CSRF 토큰 쿠키 및 매개 변수가 일치하는지 확인하고 유효한 요청인지 여부를 결정합니다.

서버 측에서 위조 토큰을 생성하는 이유는 서버가 해당 토큰을 만들고 서버 만 올바른 값을 알 수 있기 때문에 클라이언트 측에서 매개 변수가 약간 변경되면 서버에 저장된 것과 동일하지 않아서 요청을 크로스 사이트 요청 위조 공격으로 표시하는 데 충분합니다. 클라이언트 측에서 생성 된 모든 데이터는 침입자가 변조 할 수 있으므로 해당 정보에 의존 할 수 없습니다 (예 : 접근 방식). 클라이언트 측에서 임의의 값을 만들고 그 값을 CSRF 쿠키와 _csrf 매개 변수에 값이 "h246drvhd4t2cd98"이라고 가정 해 보겠습니다. 그러나 클라이언트 측의 두 변수가 동일한 값을 가지고 있는지 만 확인하고 있기 때문에 공격자는 자신의 CSRF 쿠키와 변수를 "I'mByPassingThis"와 같은 값은 유효한 요청으로 플래그 지정하여 보안을 전혀 얻지 못합니다. 반면에 토큰이 서버에서 생성되면 공격자는 예상 값을 알 수 없으며 모든 요청에 ​​따라 값이 달라지기 때문에 공격자의 최선의 방법은 예상대로 시도하는 것입니다. 서버 측에서 예측 가능한 난수 생성기를 사용하지 않는 한 사실상 불가능합니다.

또한 위조 방지 토큰 메커니즘을 만들려면 암호로 안전한 의사 난수 생성기를 사용해야합니다. 솔직히 말하면, 생성 프로세스가 필요한 것입니다 (프레임 워크에이 메커니즘이 기본적으로 포함되어 있다고 가정하면 암호화 된 보안 의사 난수 생성기를 사용하여 위조 토큰을 생성하고 있는지 확인해야합니다.).

사용자가 제출 한 정보를 신뢰하지 마십시오. 항상 위조 할 수 있으므로 서버 측에서 항상 이중 확인을 수행해야합니다.이 경우 위조 방지 토큰을 서버에 생성하면 서버의 위조 방지 토큰을 재확인 할 수 있습니다. 제출 된 위조 토큰.