2012-03-13 44 views
31

Tôi đang theo dõi Phát triển Web Django 1.3. và đối với thông tin đăng nhập, tôi nhận được lỗi sauXác minh CSRF không thành công. Yêu cầu bị hủy. trên django

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

Đây là settings.py của tôi Bao gồm APPS. Đó là chính xác như thế nào cuốn sách nói nó nên được.

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' 
) 

Cuốn sách nói, nó nên chứa, django.contrib.auth.views.login .. và tôi đang bao gồm nó trong

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)), 
) 

và đăng ký của tôi/login.html ... bản sao dán từ cuốn sách. nó nên làm.

<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> 

tôi đang thiếu gì?

Trả lời

52

Bạn cần thêm thẻ mẫu {% csrf_token %} làm con của phần tử form trong mẫu Django của bạn.

Bằng cách này, mẫu sẽ hiển thị phần tử ẩn với giá trị được đặt thành mã thông báo CSRF. Khi máy chủ Django nhận được yêu cầu biểu mẫu, Django sẽ xác minh rằng mã thông báo khớp với giá trị được hiển thị trong biểu mẫu. Điều này là cần thiết để đảm bảo rằng các yêu cầu POST (tức là yêu cầu thay đổi dữ liệu) bắt nguồn từ phiên khách hàng xác thực.

Mọi chi tiết, kiểm tra tài liệu Django tại địa chỉ: https://docs.djangoproject.com/en/dev/ref/csrf/

Dưới đây là một tổng quan về các cuộc tấn công Yêu cầu giả mạo Cross-Site: https://www.owasp.org/index.php/CSRF

+0

cảm ơn, điều này sẽ giúp ích. – debuggerpk

+3

cảm ơn liên kết –

7

Nếu bạn sử dụng csrf_token mẫu thẻ nhưng không thay đổi bất cứ điều gì, kiểm tra cài đặt CSRF_COOKIE_DOMAIN. Bạn nên đặt None cho nó trên môi trường phát triển.

+2

Kiểm tra 'CSRF_COOKIE_SECURE' nếu máy chủ dev của bạn không có ssl. – Mark

4

Chỉ muốn cung cấp thêm thông tin về chủ đề. Nếu điều đó xảy ra với bạn và bạn chắc chắn rằng mã thông báo được đưa vào biểu mẫu và các hàm xem đang xử lý mọi thứ đúng cách nhưng sự cố vẫn tiếp diễn. Đảm bảo rằng không có mã javascript nào vô hiệu hóa các trường nhập. Đã xảy ra với tôi, sau vài giờ gỡ lỗi, cuối cùng cũng nhận ra điều đó.

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

Điểm tốt; các giá trị của các phần tử biểu mẫu 'disabled' không được gửi đến máy chủ khi biểu mẫu được gửi. –

5

Tôi cũng gặp vấn đề tương tự. Tôi đã giải quyết vấn đề này khi tôi thêm {% csrf_token%}. Cuối cùng mã của tôi là:

<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

Hi chỉ cần sử dụng {% csrf_token%} bên trong biểu mẫu của bạn.Điều này làm việc cho tôi. Vậy tại sao chúng ta sử dụng giả mạo Cross-site yêu cầu? Vâng, câu trả lời khá đơn giản, nó vừa thêm một lớp bảo mật khác vào trang web của bạn, theo đó bất kỳ người dùng độc hại nào cũng không thể xác thực yêu cầu bằng cách sử dụng mã thông báo sai.

Các vấn đề liên quan