세션의 CSRF 보호 토큰을 노출하는 것이 안전합니까?
장고는 CSRF 보호 미들웨어와 함께 제공되는데, 이 미들웨어는 양식에 사용할 수 있는 고유한 세션별 토큰을 생성합니다.수신되는 모든 데이터를 검색합니다.POST올바른 토큰을 요청하고 토큰이 없거나 잘못된 경우 요청을 거부합니다.
POST 요청에 대해 AJAX를 사용하고 싶은데, 요청에 CSRF 토큰이 없다고 합니다.페이지가 없습니다.<form>연결할 요소들과 토큰을 숨겨진 가치로 삽입하여 마크업을 흐리게 하지는 않을 것입니다.이런 일을 할 수 있는 좋은 방법은 이런 것들을 노출시키는 겁니다./get-csrf-token/브라우저의 사이트 간 스크립팅 규칙을 사용하여 적대적인 사이트에서 요청하지 못하도록 하는 사용자의 토큰을 반환합니다.
이게 좋은 생각입니까?AJAX 요청을 허용하면서 CSRF 공격을 방지하는 더 나은 방법이 있습니까?
업데이트: 아래 내용은 사실이며, 모든 브라우저와 플러그인이 제대로 구현되었다면 사실이어야 합니다.유감스럽게도, 현재 우리는 이들이 그렇지 않다는 것을 알고 있으며, 브라우저 플러그인과 리디렉션의 특정 조합을 통해 공격자가 도메인 간 요청에 임의 헤더를 제공할 수 있다는 것을 알고 있습니다.불행하게도, 이것은 "X-Requested-With: XMLHttpRequest" 헤더를 가진 AJAX 요청도 이제 CSRF로 보호되어야 한다는 것을 의미합니다.이에 따라 장고는 더 이상 Ajax 요청을 CSRF 보호에서 제외하지 않습니다.
원답
브라우저는 사이트 간 AJAX 요청을 허용하지 않으므로 CSRF로부터 AJAX 요청을 보호하는 것은 불필요하다는 점을 언급할 필요가 있습니다.실제로 장고 CSRF 미들웨어는 이제 자동으로 AJAX 요청을 CSRF 토큰 스캔에서 제외합니다.
이것은 실제로 X-Requested-With 헤더 서버 측에서 "XMLHtpRequest" 값을 확인하고(Django가 수행하는) 실제 AJAX 요청을 CSRF 검색에서 제외하는 경우에만 유효합니다.
AJAX 요청을 위해 CSRF 토큰이 필요하다는 것을 알고 있다면 언제 어디서든 HTML에 삽입할 수 있습니다. 그러면 DOM을 통과하여 자바스크립트를 통해 찾을 수 있습니다.이렇게 하면 토큰에 액세스할 수 있지만 API를 통해 토큰을 노출하는 것은 아닙니다.
즉, URL 디스패처가 아니라 장고의 템플릿을 통해 수행합니다.이 방법이 훨씬 안전합니다.
취소하세요, 제가 잘못했습니다. (댓글 참조)JSON이 사양을 따르도록 해 공격을 방지할 수 있습니다.항상 개체 리터럴을 최상위 개체로 반환해야 합니다.(더 이상의 악용은 없을 것이라고 장담할 수 없습니다.브라우저 창에서 실패한 코드에 대한 액세스를 제공하는 브라우저를 상상해 보십시오. on error events!)
사이트 간 스크립팅 규칙을 사용하여 AJAX 응답을 비공개로 유지할 수는 없습니다.예를 들어 CSRF 토큰을 JSON으로 반환하면 악의적인 사이트가 String 또는 Array 생성자를 재정의하고 리소스를 요청할 수 있습니다.
bigmaty가 정확합니다.마크업 어딘가에 토큰을 내장해야 합니다.또는 일치하지 않는 참조자가 있는 모든 POST를 거부할 수도 있습니다.그렇게 하면 과도한 소프트웨어 방화벽을 가진 사람들만 CSRF에 취약하게 될 것입니다.
언급URL : https://stackoverflow.com/questions/144696/is-exposing-a-sessions-csrf-protection-token-safe
'programing' 카테고리의 다른 글
| 기존 웹사이트와의 CMS 통합 (0) | 2023.09.21 |
|---|---|
| withCount 메서드에서 where 절을 사용하는 Laravel (0) | 2023.09.16 |
| m이 3x3 행렬일 때 m[1] - m[0]이 3을 반환하는 이유는 무엇입니까? (0) | 2023.09.16 |
| 폭 100% HTML 테이블, tbody 안에 세로 스크롤 포함 (0) | 2023.09.16 |
| 저장소를 사용하지 않고 호스트 간에 도커 이미지를 복사하는 방법 (0) | 2023.09.16 |