Program Club

Rails : csrf_meta_tag는 어떻게 작동합니까?

proclub 2020. 11. 26. 20:09
반응형

Rails : csrf_meta_tag는 어떻게 작동합니까?


저는 Michael Hartl의 튜토리얼 을 읽고 Ruby on Rails를 배우는 PHP 개발자 입니다. 다음은이 책에서 인용 한 내용입니다 csrf_meta_tag.

... Rails 방법 csrf_meta_tag은 악의적 인 웹 공격의 일종 인 CSRF (cross-site request forgery)를 [방지]합니다. 세부 사항에 대해 걱정하지 마십시오. Rails가 여러분의 애플리케이션을 안전하게 유지하기 위해 열심히 노력하고 있다는 사실 만 알아 두십시오.

문제는 진심으로 궁금합니다. 삽입 csrf-paramcsrf-token메타 태그가 CSRF를 어떻게 방지합니까? 인터넷 검색을 시도했지만 아무것도 찾을 수 없습니다.


csrf_meta_tag 기본적으로 숨겨진 양식 필드와 동일한 작업을 수행하지만 양식에 연결되지 않은 자바 스크립트 요청에 토큰을 쉽게 얻을 수 있습니다.

jquery-ujs 라이브러리 를 사용하는 경우 해당 메타 태그의 내용이 모든 ajax 요청에 자동으로 추가됩니다 (요청 헤더로).


이는 csrf_meta_tag본질적으로 디지털 서명 인 것을 페이지에 삽입하여 애플리케이션 서버로 들어오는 요청이 실제로 적절하게 로그인 된 사용자로부터 온 것인지 확인하는 역할을합니다. 이렇게하면 사이트 간 스크립팅을 방지 할 수 있습니다 (다른 탭에서 Gmail에 로그인 한 상태에서 GMail과 같은 요청을 실행하는 완전히 관련없는 페이지의 스크립트).

분명히 csrf_meta_tag말씀 드리지만 , 그 자체가 관련없는 페이지가 귀하의 GMail (또는 공격의 대상이되는 다른 서비스)에 대한 요청을 시작하는 것을 방지하지는 않지만의 "디지털 서명" csrf_meta_tag은 유효성을 확인하는 데 사용됩니다. 말했다. 유효하지 않은 요청 (예 : 교차 사이트 스크립팅 시도)은 유효성 검사에 실패해야하므로 폐기됩니다.

공격자의 관점에서 다르게 말하면 :

csrf_meta_tags존재 하기 전에 (어떤 방식 으로든 Rails에만 국한되지는 않음) 성공적인 교차 사이트 스크립팅 공격으로 인해 악성 사이트는 요청이 사용자를 대신하여 수행되는 것처럼 보이도록 웹 앱에 데이터를 제출할 수있었습니다. 따라서 웹 서비스의 관리자이고 하나의 브라우저 탭에서 해당 서비스의 관리자 패널에 로그인했다고 가정 해 보겠습니다. 다른 탭에서 열린 악성 사이트가 서비스를 공격 대상으로 삼았다면 악성 사이트는 데이터베이스에서 사용자 목록을 덤프하거나 다른 민감한 데이터를 훔치거나 잠재적으로 해를 입히거나 손상을 입힐 수있는 등 관리자 요청을하는 스크립트를 실행할 수 있습니다. 또는 서비스에 포함 된 데이터를 파기하는 동안 (서버의 관점에서) 관리자 자체의 유효한 요청으로 나타납니다. 그만큼csrf_meta_tag 요청에 서명하고 이러한 시도가 성공하지 못하도록 막는 방법입니다.

여기에 훨씬 더 자세한 설명이 있습니다 .

Rails에서 생성 한 페이지 중 하나에서 "소스보기"를 수행하는 것도 교육적이며 CSRF 태그가 어떻게 생겼는지 볼 수 있습니다.


Rails에서는 이런 식으로 작동합니다.

def csrf_meta_tags
    if protect_against_forgery?
      [
        tag('meta', :name => 'csrf-param', :content => request_forgery_protection_token),
        tag('meta', :name => 'csrf-token', :content => form_authenticity_token)
      ].join("\n").html_safe
    end
  end

자세한 내용은 클릭하세요

Ruby On Rails 보안 가이드도 확인해야합니다.

여기 멋진 블로그가 있습니다

하지만-저는 국가 취약점 데이터베이스를 선호합니다. 여기에 좋은 설명이 있습니다.

CWE-352 : CSRF (Cross-Site Request Forgery)

CWE-79 : 웹 페이지 생성 중 부적절한 입력 무효화 ( '크로스 사이트 스크립팅')

이 문서에서 CWE-Common Weakness Enumeration 확인


csrf_meta_tagsAjax 요청이이를 양식 매개 변수 중 하나로 사용하여 서버에 요청하는 표시입니다. Rails는 요청을 처리하기 위해 양식 본문 (매개 변수)의 일부로 csrf를 예상합니다. 이러한 메타 태그를 사용하여 필요에 맞게 양식 본문 또는 csrf 헤더를 구성 할 수 있습니다. 이 답변이 귀하의 질문에 도움이 되었기를 바랍니다.


도우미 csrf_meta_tags의 출력 :

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" />

이 토큰은 ajax 요청에 포함될 수 있습니다. 예 ( jquery-ujs ) :

https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js#L70

    csrfToken: function() {
     return $('meta[name=csrf-token]').attr('content');
    },

    // URL param that must contain the CSRF token
    csrfParam: function() {
     return $('meta[name=csrf-param]').attr('content');
    },

    // Make sure that every Ajax request sends the CSRF token
    CSRFProtection: function(xhr) {
      var token = rails.csrfToken();
      if (token) xhr.setRequestHeader('X-CSRF-Token', token);
    },

참고 URL : https://stackoverflow.com/questions/9996665/rails-how-does-csrf-meta-tag-work

반응형