문제

장고는 함께 온다 CSRF 보호 미들웨어, 양식에 사용할 수있는 고유 한 세션 별 토큰을 생성합니다. 그것은 모든 들어오는 모든 것을 스캔합니다 POST 올바른 토큰을 요청하고 토큰이 누락되었거나 유효하지 않은 경우 요청을 거부합니다.

일부 게시물 요청에 AJAX를 사용하고 싶지만 요청에는 CSRF 토큰이 없다고 말했습니다. 페이지에는 없습니다 <form> 연결해야 할 요소는 토큰을 숨겨진 값으로 삽입하는 마크 업을 진흙 투성이에 넣지 않습니다. 나는 이것을하는 좋은 방법은 Vew처럼 노출시키는 것입니다. /get-csrf-token/ 사용자의 토큰을 반환하려면 적대적인 사이트가 요청하지 않도록 브라우저의 크로스 사이트 스크립팅 규칙에 의존합니다.

이것이 좋은 생각입니까? AJAX 요청을 허용하면서 CSRF 공격으로부터 보호하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

AJAX 요청을 위해 CSRF 토큰이 필요하다는 것을 알고 있다면 언제든지 HTML 어딘가에 포함시킬 수 있습니다. 그런 다음 DOM을 가로 질러 JavaScript를 통해 찾을 수 있습니다. 이렇게하면 여전히 토큰에 액세스 할 수 있지만 API를 통해 노출되지는 않습니다.

다른 방법으로 말하면 : URL 디스패처가 아닌 Django의 템플릿을 통해 수행하십시오. 이런 식으로 훨씬 안전합니다.

다른 팁

업데이트: 아래는 사실이었으며 모든 브라우저와 플러그인이 올바르게 구현 된 경우에도 사실이어야합니다. 불행히도, 우리는 이제 그들이 그렇지 않다는 것을 알고 있으며, 브라우저 플러그인과 리디렉션의 특정 조합은 공격자가 크로스 도메인 요청에 임의의 헤더를 제공 할 수 있음을 알고 있습니다. 불행히도, 이것은 Ajax조차도 "x- recremed-with : xmlhttprequest"헤더를 요청한다는 것을 의미합니다. 이제 CSRF 보호되어야합니다. 결과적으로 Django 더 이상 CSRF 보호에서 AJAX 요청을 면제하지 않습니다.

원래 답변

브라우저는 AJAX의 요청을 허용하지 않기 때문에 CSRF로부터 AJAX 요청을 보호하는 것은 불필요하다는 것을 언급 할 가치가 있습니다. 실제로 Django CSRF 미들웨어는 지금입니다 CSRF 토큰 스캔에서 AJAX 요청을 자동으로 면제합니다.

이것은 "xmlhttprequest"값 (django가하는)에 대한 헤더 서버 측에서 x- 퀘스트를 확인하는 경우에만 유효하며 CSRF 스캔에서 실제 AJAX 요청 만 면제하는 경우에만 유효합니다.

취소, 내가 틀렸다. (의견을 참조하십시오.) JSON이 사양을 준수하도록하여 악용을 방지 할 수 있습니다. 항상 객체를 최상위 객체로 반환하십시오. (더 이상의 익스플로잇이 없을 것이라고 보장 할 수는 없습니다. 창에서 실패한 코드에 대한 액세스를 제공하는 브라우저를 상상해보십시오.

Ajax 응답을 비공개로 유지하기 위해 간부 스크립트 규칙에 의존 할 수 없습니다. 예를 들어, CSRF 토큰을 JSON으로 반환하면 악의적 인 사이트가 문자열 또는 배열 생성자를 재정의하십시오 자원을 요청하십시오.

Bigmattyh는 정확합니다. 마크 업 어딘가에 토큰을 포함시켜야합니다. 또는 그 게시물을 거부 할 수 있습니다 하다 참조자가 있습니다 그렇지 않습니다 성냥. 이렇게하면 과도한 소프트웨어 방화벽이있는 사람들만이 CSRF에 취약합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top