2012-03-13 3 views
31

Django 1.3 Web Development를 따르고 있습니다. 로그인의 경우 다음 오류가 발생합니다.CSRF 확인에 실패했습니다. 요청이 중단되었습니다. on Django

Forbidden (403) 
CSRF verification failed. Request aborted. 
Help 
Reason given for failure: 
    CSRF token missing or incorrect. 

이것은 내 settings.py 포함 APPS입니다. 그 책이해야한다고 말하는 것과 정확히 같습니다.

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    'djangocricket.Cricket', 
    'djangocricket.cms' 
) 

이 책은 ..이 django.contrib.auth.views.login 포함한다,라고 나는

urlpatterns = patterns('', 
    # Examples: 
    url(r'^$', 'djangocricket.Cricket.views.index', name='default'), 
    url(r'^user/(\w+)/$', 'djangocricket.Cricket.views.user_home', name='user home'), 
    url(r'^login/$', 'django.contrib.auth.views.login'), 
    # url(r'^djangocricket/', include('djangocricket.foo.urls')), 

    # Uncomment the admin/doc line below to enable admin documentation: 
    #url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 

    # Uncomment the next line to enable the admin: 
    url(r'^news/', 'djangocricket.cms.views.index', name='index'), 
    #url(r'^news/(?P<slug>[^\.]+).html', 'djangocricket.cms.views.detail', name='get_single_news_item'), 
    url(r'^admin/', include(admin.site.urls)), 
) 

내 등록/login.html ... 사본을 포함하고있다 책에서 붙여. 그것이해야합니다.

<html> 
<head> 
    <title>Django Bookmarks - User Login</title> 
</head> 
<h1>User Login</h1> 
{% if form.errors %} 
    <p>Your username and password didn't match. 
     Please try again.</p> 
{% endif %} 
<form method="post" action="."> 
    <p><label for="id_username">Username:</label> 
     {{ form.username }}</p> 
    <p><label for="id_password">Password:</label> 
     {{ form.password }}</p> 
    <input type="hidden" name="next" value="/" /> 
    <input type="submit" value="login" /> 
</form> 
</body> 
</html> 

나는 무엇이 있습니까?

답변

52

템플릿 태그를 form 요소의 하위 태그로 추가해야합니다.

이렇게하면 템플릿이 값이 숨겨진 요소를 CSRF 토큰으로 렌더링합니다. Django 서버가 폼 요청을 받으면 Django는 토큰이 폼에서 렌더링 된 값과 일치하는지 확인합니다. 이는 POST 요청 (즉, 데이터 변경 요청)이 실제 클라이언트 세션에서 발생했는지 확인하는 데 필요합니다. 당신이 csrf_token 템플릿 태그를 사용하지만 아무것도 변경하지 않으면 https://www.owasp.org/index.php/CSRF

+0

감사합니다. – debuggerpk

+3

링크 –

7

다음은 크로스 사이트 요청 위조 공격의 개요입니다 https://docs.djangoproject.com/en/dev/ref/csrf/

:

는 더 많은 정보를 원하시면, 장고 설명서를 확인 CSRF_COOKIE_DOMAIN 설정을 확인하십시오. 개발 환경에서는 None으로 설정해야합니다.

+2

에 감사드립니다. dev 서버에 ssl이 없다면'CSRF_COOKIE_SECURE'도 확인하십시오. – Mark

4

주제에 대한 추가 정보를 원합니다. 그것은 당신에게 일어날 경우 토큰이 양식에 주입되고보기 기능이 모든 것을 제대로 처리하지만 문제가 지속된다고 확신하는 경우. 입력 필드를 사용 불가능하게하는 자바 스크립트 코드가 없는지 확인하십시오. 몇 시간 동안 디버깅을하고 나면 결국 깨달았습니다.

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled=""> 
+0

좋은 지적; 양식이 제출 될 때'disabled '양식 요소의 값은 서버로 보내지지 않습니다. –

5

나는 동일한 문제가있었습니다. {% csrf_token %}을 (를) 추가했을 때이 문제를 해결했습니다. 마지막으로 내 코드는 이것이다 : 당신의 form.This이 날 위해 일 안에

<form id='formulario2' method='post' action='> 
     <h3>Enter:</h3> 
     {% csrf_token %} 


    <input id="id_mesaje" name="mesaje" type="email" placeholder="E-mail"/> 
    <input type='submit' name="boton2" value='Suscribete' style="display:inline-block;background-color: #80e174; "/> 
</form> 
0

안녕하세요 단순히 {%의 csrf_token의 %} 사용합니다. 그렇다면 Cross-site requested forgery를 사용하는 이유는 무엇입니까? 답변은 매우 간단합니다. 웹 페이지에 다른 보안 계층을 추가하여 모든 악의적 인 사용자가 잘못된 토큰을 사용하여 요청의 유효성을 검사 할 수 없도록했습니다.

관련 문제