2012-02-01 4 views
25

그래서 PHP 파일에 기본 .ajax() POST 메서드가 있습니다.jQuery .ajax()에 CSRF 토큰이 필요합니까?

어떤 보안 대책이 필요합니까?

AJAX를 통해 보내고 PHP 파일에서 확인하는 숨겨진 MD5 입력 필드를 사용하여 몇 줄의 게시물을 언급하고 있습니다. 이 방법으로 충분합니까?

답변

34

CSRF의 위험은 외부 사이트에서 사용자에게 데이터를 전송할 수 있으며 사용자 브라우저가 자동으로 인증 쿠키를 보내 게된다는 것입니다.

요청이 외부 사이트가 아닌 사이트의 다른 페이지에서 온 것인지 확인할 수 있도록 수신 작업 (사용자의 $.ajax() 메서드가 POST 데이터를 보내는 중)에 필요한 방법이 필요합니다.

두 가지 방법이 있지만 권장되는 방법은 확인 가능한 토큰과 해커가 연결할 수없는 토큰을 요청에 추가하는 것입니다. 간단한에서

: 토큰 긴 임의의 문자열을 생성하고 사용자에 대해 저장에 로그에

  • .
  • 토큰을 포함하는 $.ajax() 요청에 매개 변수를 추가하십시오.
  • 요청시 해당 토큰이 사용자에 대해 저장 한 토큰과 일치하는지 확인하십시오.
  • 토큰이 일치하지 않으면 CSRF 해킹이있는 것입니다.

해커는 사용자의 DB 접근 할 수 없습니다 실제로 당신이 사용자에게 전송 한 페이지를 읽을 수 없습니다 (그들은에서 XSS 공격을 얻을하지 않는 한,하지만 그것은 또 다른 문제입니다) 그래서를 스푸핑 수 없습니다 토큰. 토큰에 중요한

모든 당신이을 예측 (및 확인) 할 수 있다는 것입니다 그것을하고 그 해커는 수 없습니다.

이러한 이유로 DB를 통해 임의로 길고 무작위로 생성하는 것이 가장 쉽지만 대신 암호화 된 것을 만들 수 있습니다. CSR의 공격자가 토큰을 생성하는 방법을 알아 내면 해킹 당할 것입니다.

또 다른 방법은 공격자가 쿠키를 읽거나 변경할 수 없기 때문에 토큰을 데이터베이스에 저장하는 대신 쿠키에 저장하는 것입니다. 그런 다음 쿠키의 HTTP POST 데이터와 일치하는 토큰입니다.

토큰이 성공적으로 사용될 때마다 변경되는 토큰 (다시 제출하지 못하도록 함)이나 사용자 및 작업과 관련된 토큰과 같이 더 정교해질 수 있지만 기본 패턴입니다.

+6

[동일 출처 정책] (https://en.wikipedia.org/wiki/Same-origin_policy)이 그러한 행동을 막을 수 있지만 어떻게 사용자가 다른 웹 사이트에서 AJAX 요청을 게시 할 수 있습니까? – Songo

+3

@Songo 불행히도 모든 브라우저가이를 지원하지는 않습니다. 프락시가 많으면 머리글을 벗겨 내고 너무 끊어집니다. 결국 AJAX를 의도하더라도 공격자가 될 것이라는 의미는 아니지만 원본 외부에서 POST 할 수 있습니다. 기본적으로 동일한 출처 정책이 있어야하지만 잘 작동하는 브라우저를 사용하기 때문에 의존하지 않아야합니다. CSRF 토큰을 사용하면 동일한 출처를 우회하더라도 사용자가 확인할 수있는 것을 제공합니다. – Keith

+0

@Songo 최신 버전의 Chrome에서도 GET 요청 (예 : 웹 페이지에서'''''태그)을 사용할 수 있으며 제대로 작동합니다. @Keith 브라우저가 모든 요청에 ​​대해 웹 페이지에 쿠키를 자동 전송하므로 쿠키를 신뢰하지 않습니다. 공격자가 iFrame 또는 양식을 사용하면 쿠키가 자동으로 전송됩니다. – arleslie

2

요청 위조와 관련하여 클라이언트가 요청한 내용을 어떻게 보내는지는 중요하지 않습니다. 동일한 유형의 게시물과 동일한 아약스 게시물에는 동일한 CSRF 규칙이 적용됩니다.

CSRF prevention cheat sheet을 읽는 것이 좋습니다. 사용자 별 비밀 토큰을 사용하는 것이 가장 보편적 인 보호 방법입니다.

+2

아주 일반적인 또한 처음 사용 후 특정 사용자 및 장애인을위한 인수 요청 당 한 번만 토큰입니다. – Tadeck

+2

@Tadeck 그 접근 방식은 CSRF보다 이중 제출을 방지하는 데 더 유용합니다. – rook

+2

[참조한 출처] (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet)에 명시된 바와 같이 일회성 토큰은 고위험 기능 내에서 사용되는 매우 강력한 보안입니다. 이것은 "CSRF_보다 이중 제출을 방지하는 데 더 유용합니다"라는 것의 반대입니다. CSRF에 대한 귀하의 신청서를보다 엄격하게 보호하는 방법입니다. – Tadeck

0

토큰이 필요하지 않지만 CSRF에 대해 상태를 변경하는 기능은 보호해야합니다.

이 작업을 수행하는 간단한 방법 중 하나는 AJAX 요청과 함께 보내는 헤더를 추가하는 것입니다. 임의의 토큰이 필요하지 않습니다.

  • HTML 양식이 공격자에 의해 그들에 추가 된 사용자 정의 헤더를 가질 수 없습니다 : 때문에

    이 작동합니다.

  • CORS를 사용하지 않으면 사용자 지정 헤더를 도메인 간을 전달할 수 없습니다.

물론 서버 측 코드는 동작을 실행하기 전에 헤더가 존재하는지 확인해야합니다.

상세 정보 : What's the point of the X-Requested-With header?

관련 문제