programing

레일 인증 토큰 이해

closeapi 2023. 5. 31. 15:56
반응형

레일 인증 토큰 이해

레일즈의 인증 토큰이란 무엇입니까?

어떻게 됩니까?

를 생성업데이트 또는 볼때의 "Discreate", "를 .authenticity_token이 토큰을 세션에 저장하고 양식의 숨겨진 필드에 배치합니다.는 사자가양제레다찾습다니음을는일즈면출용을 .authenticity_token에서는 이 값을 세션에 저장된 값과 비교하고 일치하는 경우 요청을 계속할 수 있습니다.

발생하는 이유

인증 토큰은 세션에 저장되므로 클라이언트가 해당 값을 알 수 없습니다.이렇게 하면 사용자가 해당 응용프로그램 자체에서 양식을 보지 않고도 해당 응용프로그램에 양식을 제출할 수 없습니다.당신이 A 서비스를 사용하고 있고, 서비스에 로그인했고 모든 것이 정상이라고 상상해 보세요.이제 당신이 B 서비스를 이용하러 가서 마음에 드는 사진을 보고 사진을 눌러 더 큰 크기로 볼 수 있다고 상상해 보세요.삭제를 도 있습니다. 이 은 이에, 제서 B악의코, 그에 A당요보고서내을한요있수삭당다록니청습할것도신계하의제은로인비을정그청신이스면다있었인비가드적스당▁now,▁sending▁b▁account▁was▁send▁your▁service▁it▁a▁to이▁code제,요있수▁if▁a▁some에▁evil다▁delete▁to▁there니습청록▁at할,▁into▁request당신),삭도▁are,의▁(▁might▁logged),계하http://serviceA.example/close_account이것이 CSRF(사이트 간 요청 위조)라고 알려진 것입니다.

서비스 A가 인증 토큰을 사용하는 경우 서비스 B의 요청에 올바른 인증 토큰이 포함되어 있지 않으므로 이 공격 벡터를 더 이상 적용할 수 없습니다.

API 문서에서는 메타 태그에 대한 세부 정보를 설명합니다.

는 CSRF를 사용하여 설정됩니다.protect_from_forgery토큰을 확인하고 예상과 일치하지 않으면 세션을 재설정하는 메서드입니다.이 메서드에 대한 호출은 기본적으로 새 Rails 응용프로그램에 대해 생성됩니다.토큰 매개 변수의 이름이 지정되었습니다.authenticity_token결석로으다음포양을합든다큰모렌는 레 이 토 함 하 여 추 이 야 해 니 가 값 을 름 과 의 에 웃 이 아 식 링 더 하 을 ▁that ▁must ▁by ▁be 다 ▁token ▁of ▁the ▁layout 결 ▁forms ▁including ▁this ▁namecsrf_meta_tagsHTML 헤드에 있습니다.

메모들

레일은 동일하지 않은 방법(POST, PUT/PATCH 및 DELETE)만 확인합니다.GET 요청은 인증 토큰에 대해 확인되지 않습니다. 왜죠? HTTP 사양에서 GET 요청은 동일하며 서버에서 리소스를 생성, 변경 또는 파괴해서는 안 되며 요청은 동일해야 합니다(같은 명령을 여러 번 실행할 경우 매번 동일한 결과를 얻어야 함).

또한 실제 구현은 처음에 정의된 것처럼 조금 더 복잡하여 보안이 향상됩니다.레일즈는 모든 양식에 대해 동일한 저장 토큰을 발급하지 않습니다.또한 매번 다른 토큰을 생성하고 저장하지 않습니다.세션에서 암호화 해시를 생성 및 저장하고 페이지가 렌더링될 때마다 저장된 토큰과 일치하는 새 암호화 토큰을 발급합니다.request_forgie_protection.rb를 참조하십시오.

레슨

사용하다authenticity_token사용자의 인식 불가능한 메서드(POST, PUT/PATCH 및 DELETE)를 보호합니다.또한 서버의 리소스를 수정할 수 있는 GET 요청을 허용하지 않아야 합니다.


GET 요청이 동일하다는 @erturne의 의견을 확인합니다.그는 제가 여기서 한 것보다 더 나은 방식으로 그것을 설명합니다.

인증 토큰은 웹 사이트에서 양식이 제출되고 있음을 알 수 있도록 설계되었습니다.사용자의 컴퓨터에서만 알 수 있는 고유 식별자를 사용하여 실행되는 컴퓨터에서 생성되므로 사이트 간 요청 위조 공격을 방지하는 데 도움이 됩니다.

레일이 AJAX 스크립트 액세스를 거부하는 데 어려움을 겪고 있다면 다음을 사용할 수 있습니다.

<%= form_authenticity_token %>

양식을 만들 때 올바른 토큰을 생성합니다.

자세한 내용은 설명서를 참조하십시오.

CSRF란 무엇입니까?

인증 토큰은 사이트 간 요청 위조(CSRF)에 대한 대책입니다.CSRF가 무엇인지 묻습니다.

이는 공격자가 세션 토큰을 알지도 못하면서 잠재적으로 세션을 가로챌 수 있는 방법입니다.

시나리오:

  • 은행 사이트를 방문하여 로그인합니다.
  • 그런 다음 공격자의 사이트(예: 신뢰할 수 없는 조직의 후원 광고)를 방문합니다.
  • 공격자의 페이지는 은행의 "자금 이체" 양식과 동일한 필드를 가진 양식을 포함합니다.
  • 공격자는 사용자의 계정 정보를 알고 있으며, 사용자의 계정에서 공격자의 계정으로 돈을 전송하기 위해 미리 입력된 양식 필드가 있습니다.
  • 공격자의 페이지에는 양식을 은행에 제출하는 Javascript가 포함되어 있습니다.
  • 양식이 제출되면 브라우저는 세션 토큰을 포함하여 은행 사이트에 대한 쿠키를 포함합니다.
  • 은행은 공격자의 계좌로 돈을 송금합니다.
  • 양식은 보이지 않는 iframe에 있을 수 있으므로 공격이 발생했는지 알 수 없습니다.
  • 이를 사이트 간 요청 위조(CSRF)라고 합니다.

CSRF 솔루션:

  • 서버는 서버 자체에서 가져온 양식을 표시할 수 있습니다.
  • 모든 양식에는 숨겨진 필드로 추가 인증 토큰이 포함되어야 합니다.
  • 토큰은 예측 불가능해야 합니다(공격자가 추측할 수 없음).
  • 서버는 페이지에 유효한 토큰을 양식으로 제공합니다.
  • 양식이 게시될 때 서버가 토큰을 확인하고 올바른 토큰이 없으면 양식을 거부합니다.
  • 토큰 예제: 서버 비밀 키로 암호화된 세션 식별자.
  • Rails는 자동으로 이러한 토큰을 생성합니다. 모든 양식의 authentity_token 입력 필드를 참조하십시오.

인증 토큰은 CSRF(사이트 간 요청 위조 공격)를 방지하는 데 사용됩니다.인증 토큰을 이해하려면 먼저 CSRF 공격을 이해해야 합니다.

CSRF

이 당이의저가다니정합고라의 .bank.example사이트에 GET 요청이 있는 다른 계좌로 송금하는 데 사용되는 양식이 있습니다.

여기에 이미지 설명 입력

수 . HTTP 요청은 "HTTP 요청"입니다.GET /transfer?amount=$1000000&account-to=999999 렇죠그?

여기에 이미지 설명 입력

아닙니다. 해커들의 공격은 효과가 없습니다.서버가 기본적으로 생각할 것인가요?

어? 이 남자는 대체 누구야?계정의 소유자가 아닙니다, 확실합니다.

서버가 이를 어떻게 알 수 있습니까?왜면없어가 없기 때문입니다.session_id요청자를 인증하는 쿠키입니다.

비밀번호로 시는 " " " " " 을 합니다.session_id쿠키를 브라우저에 표시합니다.이렇게 하면 사용자 이름과 암호로 각 요청을 인증할 필요가 없습니다.▁the를 보낼 때.session_id쿠키, 서버는 다음을 알고 있습니다.

오, 저 사람은 존 도우야.그는 2.5분 전에 성공적으로 로그인했습니다.그는 가도 좋습니다.

해커는 다음과 같이 생각할 수 있습니다.

음. 일반적인 HTTP 요청은 작동하지 않을 것입니다. 하지만 제가 그것을 손에 넣을 수 있다면요.session_id쿠키, 나는 황금빛이 될 것입니다.

사용자 브라우저에는 다음을 위해 설정된 쿠키 묶음이 있습니다.bank.example요청을 할 마다 사용자가 요청합니다.bank.example도메인, 모든 쿠키가 함께 전송됩니다.를포여하를 session_id쿠키

그래서 해커가 당신이 그의 계좌로 돈을 이체하는 GET 요청을 하도록 수 있다면, 그는 성공할 것입니다.그가 어떻게 당신을 속여서 그렇게 만들 수 있습니까?사이트 간 요청 위조가 있습니다.

사실 꽤 간단해요.해커는 당신이 그의 웹사이트를 방문하도록 할 수 있습니다.그의 웹사이트에는 다음과 같은 이미지 태그가 있을 수 있습니다.

<img src="http://bank.example/transfer?amount=$1000000&account-to=999999">

사용자 브라우저가 해당 이미지 태그를 발견하면 해당 URL에 대해 GET 요청을 수행합니다.그리고 그의 브라우저에서 요청이 오기 때문에, 그것은 그것과 관련된 모든 쿠키를 보낼 것입니다.bank.example에 에 bank.example...session_id쿠키가 설정될 것이고, 서버는 사용자가 $1,000,000을 999999 계좌로 송금하는 것을 의미한다고 생각할 것입니다!

여기에 이미지 설명 입력

위험한 곳은 방문하지 마세요. 그러면 괜찮을 거예요.

그것으로는 충분하지 않습니다.누군가가 페이스북에 그 이미지를 올렸는데 그것이 당신의 벽에 나타난다면 어떻게 될까요?XSS 공격으로 방문하는 사이트에 주입되면 어떻게 됩니까?

그렇게 나쁘지는 않아요.GET 요청만 취약합니다.

사실이 아닙니다.POST 요청을 보내는 양식을 동적으로 생성할 수 있습니다.다음은 레일즈 보안 가이드의 예입니다.

<a href="http://www.harmless.example/" onclick="
  var f = document.createElement('form');
  f.style.display = 'none';
  this.parentNode.appendChild(f);
  f.method = 'POST';
  f.action = 'http://www.example.com/account/destroy';
  f.submit();
  return false;">To the harmless survey</a>

인증 토큰

의 신의경우 때.ApplicationController다음이 있습니다.

protect_from_forgery with: :exception

다음 항목:

<%= form_tag do %>
  Form contents
<% end %>

다음으로 컴파일됩니다.

<form accept-charset="UTF-8" action="/" method="post">
  <input name="utf8" type="hidden" value="&#x2713;" />
  <input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
  Form contents
</form>

특히 다음이 생성됩니다.

<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />

CSRF 공격으로부터 보호하기 위해 레일즈는 요청과 함께 전송된 인증 토큰을 보지 못하면 요청을 안전하다고 간주하지 않습니다.

공격자가 이 토큰이 무엇인지 어떻게 알 수 있습니까?폼이 생성될 때마다 무작위로 다른 값이 생성됩니다.

여기에 이미지 설명 입력

사이트 간 스크립팅(XSS) 공격입니다.하지만 그것은 다른 날에 대한 다른 취약성입니다.

예방할 수 있는 최소한의 공격 예: CSRF

웹사이트에서 내웹트서에이.evil.example다음 양식을 제출하도록 설득합니다.

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="to"      value="ciro"></p>
  <p><input type="hidden" name="ammount" value="100"></p>
  <p><button type="submit">CLICK TO GET PRIZE!!!</button></p>
</form>

세션 쿠키를 통해 은행에 로그인한 경우 쿠키가 전송되고 사용자도 모르게 전송됩니다.

이것이 CSRF 토큰이 작동하게 된 이유입니다.

  • 폼을 반환한 GET 응답을 사용하여 Rails는 매우 긴 임의 숨김 매개 변수를 보냅니다.
  • 브라우저가 POST 요청을 만들 때 매개 변수를 함께 보내고 서버는 일치하는 경우에만 이 매개 변수를 수락합니다.

따라서 정품 브라우저의 양식은 다음과 같습니다.

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="authenticity_token" value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p>
  <p><input type="hidden" name="to"                 value="ciro"></p>
  <p><input type="hidden" name="ammount"            value="100"></p>
  <p><button type="submit">Send 100$ to Ciro.</button></p>
</form>

그러므로, 내 공격은 실패할 것입니다, 왜냐하면 그것은 그것을 보내지 않았기 때문입니다.authenticity_token파라미터, 그리고 그것은 엄청난 난수이기 때문에 제가 추측할 수 있는 방법이 없습니다.

이 방지 기술을 동기화자 토큰 패턴이라고 합니다.

동일한 오리진 정책

하지만 공격자가 자바스크립트로 두 가지 요청을 했는데, 하나는 토큰을 읽고 다른 하나는 전송을 하는 것입니까?

동기화 토큰 패턴만으로는 이를 방지할 수 없습니다!

이것이 제가 https://security.stackexchange.com/questions/8264/why-is-the-same-origin-policy-so-important/72569#72569 에서 설명했듯이 동일 원산지 정책이 구조에 도달하는 부분입니다.

레일즈가 토큰을 보내는 방법

피복 범위: 레일: csrf_meta_tag의 작동 방식

기본적으로:

  • 과 같은 HTML :form_tagGET 양식이 아닌 경우 양식에 숨겨진 필드 추가

  • AJAX는 Jquery-ujs에 의해 자동으로 처리됩니다. jquery-ujs는 에서 토큰을 읽습니다.meta했습니다.csrf_meta_tags(기본 템플릿에 있음), 요청에 추가합니다.

    또한 uJS는 오래된 캐시된 조각의 토큰 정보를 업데이트하려고 합니다.

기타 예방 접근법

Authenticity Token israils' 메서드는 '교차 사이트 요청 위조(CSRF 또는 XSRF)' 공격을 방지합니다.

간단히 말해, 웹 앱에 대한 PUT / POST / DELETE(내용을 수정할 수 있는 방법) 요청은 클라이언트 측에서 생성된 쿠키에 액세스할 수 있는 타사(공격자)가 아니라 클라이언트 브라우저에서 수행됩니다.

이래Authenticity Token 3 3.0+를 할 수 있습니다.

 <%= token_tag nil %>

생성하기

<input name="authenticity_token" type="hidden" value="token_value">

아무 곳이나.

동일한 클라이언트에서 여러 개의 동시 요청이 있을 경우 Authentity Token 메커니즘으로 인해 경쟁 상태가 발생할 수 있습니다.이 경우 서버는 하나만 있어야 할 때 여러 개의 인증확인 토큰을 생성할 수 있으며, 세션 쿠키 토큰을 덮어썼기 때문에 이전 토큰을 양식으로 받은 클라이언트는 다음 요청에서 실패합니다.이 문제에 대한 설명과 완전히 사소하지 않은 해결책이 있습니다. http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/

은 다음과 .authenticity_token필수 항목입니다.

authenticity_token게시, 입력 및 삭제와 같은 동일한 메서드의 경우 필요합니다. I empotent 메서드가 데이터에 영향을 미치기 때문입니다.

필요한 이유

세션됩니다. authentity_"는 리소스를 을 만들 됩니다.authentity_token은 세션에 저장되며, 리소스를 만들거나 업데이트하기 위해 웹 페이지에 양식이 생성될 때마다 인증 토큰이 숨겨진 필드에 저장되고 서버에 양식과 함께 전송됩니다.하기 전에 user 을 user sent authentity_token과 합니다.authenticity_token세션에 저장됩니다.한다면authenticity_token프로세스가 계속되는 경우와 동일하며 그렇지 않으면 작업을 수행하지 않습니다.

authentication_token이란 무엇입니까?

사용자가 다른 앱이나 사이트가 아닌 앱 페이지에서 작업을 요청하거나 수행하는지 확인하기 위해 레일 응용 프로그램에서 사용하는 임의 문자열입니다.

authentication_token이 필요한 이유는 무엇입니까?

앱 또는 사이트를 사이트 간 위조로부터 보호합니다.

authentication_token을 양식에 추가하는 방법은 무엇입니까?

를 사용하여 됩니다. 그렇지 form_for 를 사용할 수 . 그렇지 않으면 다음을 사용할 수 있습니다.<%= csrf_meta_tag %>.

언급URL : https://stackoverflow.com/questions/941594/understanding-the-rails-authenticity-token

반응형