복붙노트

[RUBY-ON-RAILS] CSRF 보호를 해제하지 않고 API 디자인 레일

RUBY-ON-RAILS

CSRF 보호를 해제하지 않고 API 디자인 레일

돌아 가기 2011 년 2 월, 레일은 심지어 API를 엔드 포인트에 대한 모든 비 GET 요청을 토큰 CSRF을 필요로 변경되었습니다. 나는이 브라우저 요청에 대한 중요한 변화 이유에 대한 설명을 이해하지만 그 블로그 게시물은 API 변경 사항을 처리하는 방법에 대한 조언을 제공하지 않습니다.

나는 특정 작업에 대한 CSRF 보호를 비활성화에 관심이 아니다.

어떻게 API는 이러한 변화에 대처 해야하는? API를 클라이언트가 CSRF 토큰을 얻을 수있는 API에 GET 요청을 만드는 것이라는 기대는,인가 포함하는 세션 동안 모든 요청 토큰?

이 토큰이 하나 POST에서 다른 변경하지 않는 것 같습니다. 이 토큰은 세션 기간 동안 변경되지 않습니다 가정 안전합니까?

세션이 만료되면 내가 처리 여분의 오류를 즐길 모르겠지만, 나는 그것이 모든 POST / PUT / DELETE 요청하기 전에 토큰을 GET하는 것보다 더 나은 가정하자.

해결법

  1. ==============================

    1.오래된 질문하지만 보안은 나는 그것이 완전한 답변을받을 권리가 느끼는 것이 중요 충분하다. 이 질문에서 설명하고있는 바와 같이 여전히 심지어 API를 CSRF의 몇 가지 위험이 있습니다. 예 브라우저는 기본적으로이 방지하려면 가정하고 있지만 브라우저의 완벽하게 제어 할 수 있습니다 설치 한 사용자를 플러그인하지 않는 한, 여전히 API에 CSRF 방지하기 위해 최선의 방법을 고려해야합니다.

    오래된 질문하지만 보안은 나는 그것이 완전한 답변을받을 권리가 느끼는 것이 중요 충분하다. 이 질문에서 설명하고있는 바와 같이 여전히 심지어 API를 CSRF의 몇 가지 위험이 있습니다. 예 브라우저는 기본적으로이 방지하려면 가정하고 있지만 브라우저의 완벽하게 제어 할 수 있습니다 설치 한 사용자를 플러그인하지 않는 한, 여전히 API에 CSRF 방지하기 위해 최선의 방법을 고려해야합니다.

    나는 완료 때때로을 본 적이 방법은 HTML 페이지 자체에서 CSRF 메타 태그를 구문 분석하는 것입니다. 그것은 하나의 페이지 + API의 많은 오늘 앱의 작동 방식과 잘 맞지 않고 나는 CSRF 토큰에 관계없이 그것의 HTML, JSON 또는 XML 여부의 모든 요청에 ​​전송한다고 생각 같은 있지만 나는 이런 식으로 정말하지 않습니다.

    내가 대신 모든 요청에 ​​대해 필터 후 통해 쿠키 나 헤더 값으로 토큰 CSRF를 전달하는 게 좋을 것 그래서. API는 단순히 이미 검사를 레일 X-CSRF 토큰의 헤더 값으로 그 뒤를 다시 제출할 수 있습니다.

    내가 AngularJS와 함께 그것을 어떻게입니다 :

      # In my ApplicationController
      after_filter :set_csrf_cookie
    
      def set_csrf_cookie
        if protect_against_forgery?
          cookies['XSRF-TOKEN'] = form_authenticity_token
        end
      end
    

    자동 AngularJS와 XSRF 토큰라는 이름의 쿠키를 검색하지만 당신의 목적을 위해 당신이 원하는 무엇이든의 이름을 주시기 바랍니다. 당신이 POST / PUT을 제출할 때 다음 / 자동 찾습니다 레일 헤더 속성 X-CSRF 토큰을 설정하려면해야 삭제합니다.

    불행하게도, AngualrJS 이미 다시 X-XSRF 토큰의 헤더 값의 XSRF 토큰 쿠키를 보냅니다. 그것은 다음과 같이와 ApplicationController이를 수용하는 레일 '기본 동작을 재정의하기 쉽습니다 :

      protected
    
      def verified_request?
        super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
      end
    

    레일 4.2를 들어 사용해야 CSRF의 유효성을 확인하는 지금 도우미 내장이있다.

      protected
    
      def verified_request?
        super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
      end
    

    그게 도움이되기를 바랍니다.

    편집 : 나는 그것이 로그인에 대한 API를 통해 토큰 CSRF를 전달하는 것은 특히 나쁜 관행이라고 나온 제출 된 레일 풀 요청이에 대한 논의에서 (예를 들어, 누군가가 귀하의 사이트에 대한 타사 로그인을 만들 수있는 사용하는 사용자 자격 증명 대신) 토큰. cavet의 위험 부담 그래서. 그것은 당신이 당신의 응용 프로그램에 대한 그것에 대해 얼마나 관심을 결정하는 당신에게 달려 있습니다. 이 경우 당신은 여전히 ​​위의 방법을 사용할 수 있지만 이미 모든 요청에 ​​대해 인증 된 세션이 아닌 브라우저에 CSRF 쿠키를 다시 보냅니다. 이것은 CSRF 메타 태그를 사용하지 않고 유효한 로그인을 제출하는 것을 방지 할 수 있습니다.

  2. ==============================

    2.'기본에 의해 보호'협약 작품 레일. 사이트 간 또는 크로스 세션 요청 위조 브라우저와 다른 신뢰의 웹 사이트를 가지고있는 사용자가 필요합니다. 그들은 브라우저에서 실행되지 않습니다 및 세션을 유지하지 않기 때문에 이것은, API에 대한 관련이 없습니다. 따라서 API에 대한 CSRF를 사용하지 않도록 설정해야합니다.

    '기본에 의해 보호'협약 작품 레일. 사이트 간 또는 크로스 세션 요청 위조 브라우저와 다른 신뢰의 웹 사이트를 가지고있는 사용자가 필요합니다. 그들은 브라우저에서 실행되지 않습니다 및 세션을 유지하지 않기 때문에 이것은, API에 대한 관련이 없습니다. 따라서 API에 대한 CSRF를 사용하지 않도록 설정해야합니다.

    물론, 당신은 HTTP 인증 또는 사용자 정의 구현 API 토큰 또는 OAuth를 솔루션을 필요로하여 API를 보호해야합니다.

  3. from https://stackoverflow.com/questions/7600347/rails-api-design-without-disabling-csrf-protection by cc-by-sa and MIT license