2012-07-23 4 views
7

쿠키, CSRF 및 Django (1.4 사용)에서 초보자이기 때문에 어떻게 작동하는지 알 수 있습니다.Django의 CSRF 보호는 어떻게 작동합니까?

다음 내용은 django.middleware에 적용됩니다. csrf.CsrfViewMiddleware는 MIDDLEWARE_CLASSES 튜플에 포함됩니다. 포스트 폼이 csrf_token 태그를 포함하고, 당해보기 페이지를 요청하는 템플릿 RequestContext 전달

장고 영숫자 문자열을 포함하는 숨겨진 폼 필드를 포함하는 것을 의미한다. Django는 또한 브라우저에 이름이 csrftoken으로 설정되고 값이 동일한 영숫자 문자열로 설정된 쿠키를 반환합니다.

양식 제출을 받으면 장고는 숨겨진 양식 필드의 영숫자 문자열 값과 브라우저에서받은 csrftoken 쿠키가 일치하는지 확인합니다. 일치하지 않으면 403 응답이 발행됩니다.

CSRF 공격은 iframe이 포함 된 악성 웹 사이트의 형태로 나타날 수 있습니다. iframe에는 POST 양식과 일부 JavaScript가 포함되어 있습니다. 양식의 action 속성이 내 Django 사이트를 가리 킵니다. 이 양식은 내 사이트에서 불쾌한 행동을하도록 고안되었으며 JS는 iframe이로드 될 때 양식을 제출합니다.

브라우저에는 csrftoken 쿠키가 양식 제출 헤더에 포함됩니다. 그러나 양식에 일치하는 영숫자 문자열이 숨겨진 필드를 포함하지 않으므로 403이 반환되고 공격은 실패합니다. 올바른 hiddden 양식 필드를 만들기 위해 iframe JS가 쿠키에 액세스하려고 시도하면 브라우저가 쿠키를 액세스하지 못하게합니다.

이 정보가 맞습니까?

+1

잘못된 것이 없습니다. 어쩌면 다른 사람들도 그렇게 하겠지만 일반적으로 당신은 그것을 얻습니다. – Zashas

답변

0

나는 당신이 옳은 것을 말할 것입니다. here 자기 자신의 정립을 발견 할 것이다.

은 요약하면 :

  • CSRF 토큰은 악성 코드가 알고해야한다는 것을 의미 코드에서 전송됩니다.
  • CSRF 토큰은 쿠키에 저장되고 브라우저에서 전송됩니다.
  • 공격자가 동일한 출처 정책으로 인해 쿠키에 액세스 할 수 없습니다.
  • 서버는 단순히 쿠키에서 오는 "안전한"값이 코드에서 오는 것과 동일한지를 간단히 확인할 수 있습니다.
1

공식 Django 문서에 원하는 내용이 설명되어 있다고 생각합니다. 위의 링크 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

은 내가 시도 할 때 깨진 있지만, 버전 1.7이 작동되었습니다 https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

+1

링크를 제공해 주셔서 감사합니다. "이렇게하면 웹 사이트에서 보낸 양식 만 POST 데이터를 다시 사용할 수 있습니다." 그러나 그것을 보장하지는 않습니다. –

+0

나는 장고 코드베이스의 일부를 최근에 보지 않았지만 다른 곳에서 알게되면 UrlParse를 사용하여 기본 URL을 검색하고 기본 URL이 호스트 URL과 일치하지 않으면 오류를 반환하거나 자동으로 실패합니다. (foo : //와 같은 다른 스키마에 대한 응답을 반환하려고하면 자동으로 실패합니다. – fundamol

관련 문제