3

모바일 앱용 백엔드를 만들고 Userena와 함께 Django를 사용하여 사용자 관리를하고 있습니다. 로그인을하고 Django REST 프레임 워크를 사용하여 등록하면 모든 것이 잘 동작합니다. 지금해야 할 일은 "암호 잊어 버리기"기능을 구현하는 것뿐입니다. Userena에서 이미 구현 된 것을 사용하고 싶었지만 csrf_exempt dectorator를 사용한 후에도 "CSRF 토큰 누락 또는 부정확"오류를 제거 할 수 없습니다. 나는 무엇을 worng하고 있냐?csrf_exempt가 django auth와 작동하지 않습니다

urls.py

from django.contrib.auth.views import password_reset 
from django.views.decorators.csrf import csrf_exempt 
... 
urlpatterns = patterns(
    '', 
    url(r'^password/mobile/reset/$', 
     csrf_exempt(password_reset), 
     {'template_name': 'userena/password_reset_form.html', 
     'email_template_name': 'userena/emails/password_reset_message.txt', 
     'extra_context': {'without_usernames': userena_settings.USERENA_WITHOUT_USERNAMES} 
     }, 
     name='userena_password_mobile_reset'), 
) 

passowrd_reset_form.html

{% extends 'userena/base_userena.html' %} 
{% load i18n %} 

{% block title %}{% trans "Reset password" %}{% endblock %} 

{% block content %} 
<form action="" method="post"> 
    <fieldset> 
    <legend>{% trans "Reset Password" %}</legend> 
    {% csrf_token %} 
    {{ form.as_p }} 
    </fieldset> 
    <input type="submit" value="{% trans "Send password" %}" /> 
</form> 
{% endblock %} 
+0

브라우저의 개발 도구와 같이 해당 양식에서 보낸 요청을 살펴보면 ('네트워크'탭 ...), 보낸 데이터에 포함 된 CSRF 토큰입니까? CSRF 보호에서보기를 제외하면 좋은 생각이 아닙니다. 공격자가 사용자의 비밀번호를 재설정 할 수 있기 때문에 – sk1p

+0

도 추가 할 수 있습니다. 단지 csrf_exempt 데코레이터를 확인하려고합니다. –

+0

@sawangupta csrf_excempt는 자신의 URL 구성에 적용됩니다. CSRF 토큰이 포함되어 있기 때문에 브라우저를 사용할 때'csrf_exempt (password_reset) ' – sk1p

답변

6

암호 재설정보기로 게시하기 전에 GET 요청을 할 경우, 당신은 쿠키의 CSRF 토큰, 당신이 할 수를 얻을 수 그런 다음 POST 요청을 보냅니다.

보기 면제를 주장하는 경우 : CSRF 보호가 password_reset보기에 적용되는 방식에 문제가 있다고 생각합니다. 명시 적으로 csrf_protect로 장식되어 있습니다.

original_password_reset_viewcsrf_protect이없는 password_reset이라고 가정하면 문제를 자세히 볼 수 있습니다. 기본적으로, 당신이 일을하고 있습니다 :

csrf_exempt(csrf_protect(original_password_reset_view)) 
# ^^ your code 
#   ^^ the decorator in django.contrib.auth.views 

을 그리고 CsrfViewMiddleware의 효과에 추가, 우리는

csrf_protect(csrf_exempt(csrf_protect(original_password_reset_view))) 

csrf_protect의 등가를 얻을 단지 CsrfViewMiddleware에서 middleware-turned-decorator입니다. 반면에 csrf_exempt은 인수로 simply sets csrf_exempt=True입니다. 따라서 바깥 쪽 csrf_protect으로 표시된 미들웨어는 뷰에 csrf_exempt=True 값을보고 CSRF 예측을 비활성화합니다. 바깥 쪽csrf_protect을 무효화합니다. 그래서 우리는 :

csrf_protect(original_password_reset_view) 

보기가 여전히 보호되어 있습니다. 기본적으로 주변에는 정상적인 방법이 없습니다. (미친 방법 : 해당 URL에 대해 request.csrf_processing_done = True을 설정하는 미들웨어를 작성하십시오. 그러지 마십시오 ...)

+0

설명 주셔서 감사합니다! – kahlo