2014-02-08 1 views
2

백엔드로 django를 사용하는 몇 가지 모바일 앱을 만들었지 만 이제는 Chrome 확장 프로그램에서 작업하고 있습니다. 내 사용자가 app/extension을 사용하여 서버에 POST 요청을 보낼 수있게하려면 먼저 서버에 CSRF 토큰을 요청하지 않고이를 수행 할 수있는 방법이 있습니까? 그것은 단지 우리가 데이터를 제출하기를 원할 때마다 두 가지 요청을하는 것을 막아줍니다. 예를 들어 소셜 미디어 앱에서 내 프로필을 업데이트하거나 Chrome 확장 프로그램에서 지갑을 업데이트하고 싶습니다. 프로필보기를 열어서 데이터를 입력하고 서버로 푸시하는 것이 좋을 것입니다. 프로필을 열어야하는 경우 매끄럽지 않으며 서버에서 토큰을 가져올 때까지 기다렸다가 데이터를 제출할 수 있습니다. 이것을 할 또 다른 방법이 있습니까? 아니면 데이터를 제출할 때마다 여러 번 요청을 받겠습니까?Django 모바일 앱 및 크롬 확장에 대한 CSRF 보호

또한 CSRF는 사이트가 사용자 데이터로 양식을 제출하지 못하게합니다. 하지만 아약스 등을 사용하여 실제 사이트를 포착하고 CSRF 토큰을 훔쳐서 내 크로스 사이트 요청 양식에 붙여 넣을 수있는 사이트를 만들지 못하게하는 것은 무엇입니까? 여기에 허점이있는 것처럼 느껴집니다. 나는이 모든 것을 완전히 이해하지 못한다는 것을 안다.

답변

4

API 끝점 CSRF를 면제 할 수 있으며,해야합니다.

장고는 정확히 데코레이터를 제공합니다 (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt 참조).

또한 CSRF는 의도하지 않은 동작이 GET 요청 위조를 통해 수행되는 것을 방지하기위한 것입니다. 자동화 된 시스템이 양식을 제출하는 것을 불가능하게하려는 의도는 아니며,이를위한 captcha가 있습니다.

AJAX를 사용하여 전체 사이트를 움켜 쥐고 토큰을 추출하는 것을 막는 요인은 Same-Origin Policy입니다. 이것은 브라우저에 의해 구현되며 AJAX 호출의 대상이 올바른 헤더가 설정되지 않은 다른 도메인 인 경우 AJAX 호출이 데이터를 반환하는 것을 방지합니다. (나는 이것에 관해서 크롬 확장에 어떤 샌드 박싱이 적용되는지 완전히 모른다.) 따라서 AJAX를 통해 일반 웹 사이트 (예 : 웹 사이트)를 통해 데이터를 가져 오지 못하거나 적어도 실패해야합니다. 프로필 페이지. 타사 웹 사이트와 상호 작용하려면 API를 제공하는지 여부를 조사해야합니다.

+0

그래서 csrf_exempt를 지정하면 csrf 토큰이 필요하지 않습니다. 앱에 대한 백엔드 용으로 사용하고 실제 페이지를 제공하지 않으면 미들웨어 권한을 사용 중지 할 수 있습니까? 나는 오늘 csrf에 대해 많은 책을 읽었습니다. (나는 이전에 그것을 이해했다고 생각했지만 분명히 그렇지 않다고 생각했습니다.) CSRF는 사람들이 사용자 세션을 유지하려고 시도하는 가짜 사이트를 만들지 못하도록 막는 것입니다. –

+1

CSRF는 세션 고정 공격에 사용될 수 있습니다. 그러나 다른 공격도 가능합니다. 당신이 만들고 API 만 있다면 CSRF 미들웨어를 제거 할 수 있습니다. 대신 모든 요청은 어떤 방법으로 인증되어야합니다. 예 : 토큰 또는 자격 증명. – EWit