Chính xác thì tiêu đề Access-Control-Allow-Credentials làm gì?


167

Tôi đang cố gắng hiểu cách sử dụng CORS và bối rối về những gì Access-Control-Allow-Credentialstiêu đề làm.

Các tài liệu nói

Cho biết liệu phản hồi cho yêu cầu có thể được hiển thị hay không khi cờ thông tin xác thực là đúng.

Nhưng tôi không hiểu phản hồi bị "phơi bày" nghĩa là gì.

Bất cứ ai cũng có thể giải thích những gì tiêu đề này được đặt thành đúng (kết hợp với cờ thông tin đăng nhập được đặt thành đúng) thực sự không?


xhr.withCredential doc về phía nhà phát
Weishi Zeng

Câu trả lời:


264

Theo mặc định, CORS không bao gồm cookie trên các yêu cầu xuất xứ chéo. Điều này khác với các kỹ thuật có nguồn gốc chéo khác như JSON-P. JSON-P luôn bao gồm các cookie có yêu cầu và hành vi này có thể dẫn đến một lớp các lỗ hổng được gọi là giả mạo yêu cầu chéo trang hoặc CSRF.

Để giảm khả năng xảy ra lỗ hổng CSRF trong CORS, CORS yêu cầu cả máy chủ và máy khách phải thừa nhận rằng có thể bao gồm cookie theo yêu cầu. Làm điều này làm cho cookie trở thành một quyết định chủ động, thay vì một cái gì đó xảy ra thụ động mà không có sự kiểm soát nào.

Mã khách hàng phải thiết lập các withCredentialstài sản trên XMLHttpRequestđể truenhằm cho phép.

Tuy nhiên, tiêu đề này là không đủ. Máy chủ phải trả lời với Access-Control-Allow-Credentialstiêu đề. Đáp ứng với tiêu đề này truecó nghĩa là máy chủ cho phép cookie (hoặc thông tin đăng nhập của người dùng khác) được đưa vào các yêu cầu xuất xứ chéo.

Bạn cũng cần đảm bảo trình duyệt của bạn không chặn cookie của bên thứ ba nếu bạn muốn các yêu cầu được chứng thực nguồn gốc chéo hoạt động.

Lưu ý rằng bất kể bạn đang thực hiện các yêu cầu có cùng nguồn gốc hoặc xuất xứ chéo, bạn cần bảo vệ trang web của mình khỏi CSRF (đặc biệt nếu yêu cầu của bạn bao gồm cookie).


1
Tôi làm rõ câu trả lời để bao gồm câu hỏi của bạn. Về cơ bản JSON-P làm sai và kém an toàn hơn.
thứ hai

28
Chỉ muốn thêm vào điều này một chút để bình luận về ý nghĩa của "tiếp xúc." Thông số kỹ thuật không yêu cầu chuyến bay trước (khứ hồi bổ sung để kiểm tra xem máy chủ có cho phép thông tin đăng nhập không) cho các yêu cầu GET. Thay vì chiếu trước, trình duyệt sẽ luôn đưa ra yêu cầu, gửi cookie nếu withCredentialsđược đặt, nhưng sau đó khi nhận được phản hồi, nếu withCredentials được đặt, nó sẽ chỉ gửi / hiển thị kết quả cho javascript gọi nếu phản hồi có quyền truy cập Bộ tiêu đề -Control-Cho phép-Thông tin xác thực. Nếu không có tiêu đề, nó không phơi bày phản hồi, thực sự che giấu nó.
heavyvi5ide

4
@ hypervi5ide, Yea, ngay cả khi trình duyệt không hiển thị phản hồi cho mã máy khách, yêu cầu với cookie vẫn được gửi (đối với các yêu cầu không được chiếu trước). Vì vậy, CSRF vẫn sẽ được thực hiện.
Pacerier

7
Vì đây là một câu trả lời phổ biến, tôi sẽ thêm một thông tin quan trọng khác: ngoài việc định cấu hình chính xác yêu cầu và tiêu đề phản hồi của bạn, bạn cũng cần đảm bảo trình duyệt của bạn không chặn cookie của bên thứ ba nếu bạn muốn yêu cầu chứng nhận nguồn gốc chéo để làm việc. Xem stackoverflow.com/a/16634887/2970321
alexw 18/2/2016

5
Đây là một câu trả lời rõ ràng đến mức bất cứ ai đọc nó lần đầu tiên đều có thể hiểu và sửa mã của họ dường như không hoạt động tốt với cookie. Cảm ơn!
vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.