2011-11-10 22 views
6

Sau khi tìm kiếm trên Internet, mọi người thường xử lý tình huống này --- giao diện người dùng được tạo bởi chức năng xem django có thể gửi cho người dùng cookie mã thông báo csrf. Khi người dùng có yêu cầu đến máy chủ bằng cách sử dụng ajax, mọi người có thể viết lại hành vi ajaxSend gửi csrf tới máy chủ. Tuy nhiên, tình trạng của tôi là front-end của tôi hoàn toàn tách biệt khỏi back-end, tức là, front-end của tôi nằm trong một máy chủ chuyên dụng chạy nginx, và tôi chỉ có một html cung cấp tất cả các trang khác nhau bằng cách sử dụng băm băm (Hashbang). . Back-end của tôi đang chạy trong máy chủ khác nhau bằng cách sử dụng tên miền khác nhau và trong trường hợp này, khách hàng có được cookie csrf như thế nào? Back-end của tôi chỉ cung cấp json api return.Django CSRF khi phụ trợ và lối vào được tách ra

Cảm ơn bạn.

+0

hãy trả lời ai đó này = / – holms

Trả lời

0

If you look at the CRSF token source: you can see that all the csrf_middleware does it check the cookie against the post value. Bạn chỉ cần nhận giá trị bài đăng trở lại máy chủ của mình vì cookie đã được đặt mặc dù ajax. If you look at the template tag source you can see that it is just taking the variable out of the context. Hoặc là dính nó vào phản ứng của bạn bằng cách kéo nó ra khỏi bối cảnh nếu nó có sẵn hoặc calling the context processor directly. Bây giờ bạn chỉ cần gửi nó trở lại như biến POST crsf_token.

0

Cho phép nói, giao diện người dùng có tên miền frontend.example.com và backend domain backend.example.com. (Nếu bạn là một cái gì đó giống như Django phần còn lại khuôn khổ) Nếu bạn có thể sử dụng có hai cách bạn có thể kích hoạt lớp bảo mật tức là,. CSRF bảo vệ hoặc CORS

Đối CORS,

pip install django-cors-headers 

và sau đó cấu hình này để INSTALLED_APPS, MIDDLEWARE_CLASSES và thêm miền frontend để CORS_ORIGIN_WHITELIST.

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com' 
) 

CORS sẽ chặn bất kỳ yêu cầu http phát sinh từ bất kỳ lĩnh vực khác hơn frontend.example.com


Đối với CSRF,

CSRF_COOKIE_DOMAIN = ".mydomain.com" 

và nếu bạn đang sử dụng một ứng dụng kiễu góc, làm như bên dưới,

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
$httpProvider.defaults.withCredentials = true; 

và sau đó thêm tiêu đề trong khi thực hiện một yêu cầu http.

headers : { 
    "x-csrftoken" : $cookies.csrftoken 
} 
Các vấn đề liên quan