2014-12-08 14 views
14

Tôi đã đọc lên trên CORS và cách hoạt động, nhưng tôi đang tìm thấy rất nhiều điều khó hiểu. Ví dụ, có rất nhiều chi tiết về những thứ nhưCORS sắp sửa giải quyết vấn đề gì?

tài Joe đang sử dụng trình duyệt BrowserX để lấy dữ liệu từ site.com, mà lần lượt sẽ gửi một yêu cầu đến spot.com. Để cho phép điều này, spot có tiêu đề đặc biệt ... yada yada yada

Nếu không có nền nhiều, tôi không hiểu tại sao các trang web không cho phép yêu cầu từ một số nơi. Ý tôi là, họ tồn tại để đáp ứng yêu cầu, phải không? Tại sao một số yêu cầu nhất định không được phép?

Nó sẽ thực sự đánh giá cao một lời giải thích tốt đẹp (hoặc một liên kết đến một) của vấn đề mà CORS được thực hiện để giải quyết.

Vì vậy, câu hỏi là,

gì là vấn đề CORS được giải quyết?

Trả lời

14

Hành vi mặc định của trình duyệt web khởi tạo yêu cầu từ trang qua JavaScript (AKA AJAX) là chúng tuân theo same-origin policy. Điều này có nghĩa là các yêu cầu chỉ có thể được thực hiện thông qua AJAX cho cùng một miền (hoặc miền phụ). Các yêu cầu đến một miền hoàn toàn khác sẽ không thành công.

Hạn chế này tồn tại do các yêu cầu được thực hiện tại các miền khác của trình duyệt sẽ mang theo cookie thường có nghĩa là bạn đã đăng nhập vào trang web khác. Vì vậy, không có cùng nguồn gốc, bất kỳ trang web nào đều có thể lưu trữ JavaScript được gọi là đăng xuất trên stackoverflow.com chẳng hạn và nó sẽ đăng xuất bạn. Bây giờ hãy tưởng tượng các biến chứng khi chúng ta nói về mạng xã hội, trang web ngân hàng, v.v.

Vì vậy, tất cả trình duyệt chỉ giới hạn các cuộc gọi mạng dựa trên tập lệnh vào tên miền riêng của chúng để đơn giản và an toàn.

Site X ở www.x.com không thể đưa ra yêu cầu AJAX vào trang web Y tại www.y.com, chỉ để * .x.com

Có một số được biết đến công việc ở quanh tại chỗ (chẳng hạn như JSONP không bao gồm cookie trong yêu cầu), nhưng đây không phải là giải pháp lâu dài.

CORS cho phép các yêu cầu miền chéo này xảy ra, nhưng chỉ khi mỗi bên chọn hỗ trợ CORS.

+0

Ah ok, do đó, đó là trình duyệt đặt các quy tắc này. Nếu vậy, thì cái gì với 'Access-Control-Allow-Origin' ở cuối máy chủ? Làm thế nào sẽ vượt qua các yêu cầu xuất xứ ngay cả khi đến đó nếu trình duyệt không cho phép? – CodyBugstein

+0

@Imray - xem liên kết CORS trong câu trả lời của tôi. Trình duyệt mới hơn * hỗ trợ * CORS nếu các trang web * chọn tham gia * để sử dụng nó (thông qua tiêu đề). – Haney

+0

Trong MDN Access Cotrol doc, yêu cầu GET với thông tin đăng nhập không được xem trước. Nhưng nếu tiêu đề phản hồi không bao gồm Access-Control-Allow-Credentials: true thì phản hồi sẽ không có sẵn cho trình khách gọi. Nếu hành vi này giống với POST (yêu cầu POST đơn giản với thông tin đăng nhập - Loại nội dung có thể là biểu mẫu dữ liệu), thì có nguy cơ POST có thể thay đổi trạng thái máy chủ mặc dù phản hồi có thể không được cung cấp cho khách hàng. Giả định này có đúng không? HOẶC yêu cầu POST có thông tin đăng nhập được bay trước? –

1

Có lý do bảo mật và quyền riêng tư vì không cho phép yêu cầu từ bất kỳ đâu. Nếu bạn truy cập trang web của tôi, bạn sẽ không muốn mã của tôi yêu cầu Facebook, reddit, ngân hàng, eBay, v.v. từ trình duyệt của bạn bằng cookie của bạn, đúng không? Sau đó, trang web của tôi có thể tạo bài đăng, đọc thông tin, đặt hàng, v.v. thay cho bạn. Hoặc thay cho tôi bằng tài khoản của bạn.

9

Trước tiên, hãy nói về cùng chính sách gốc.Tôi sẽ báo giá từ a previous answer of mine:

Cùng xuất xứ chính sách được phát minh bởi vì nó ngăn chặn mã từ một trang web truy cập chứng chỉ hạn chế nội dung trên một trang web khác. Các yêu cầu Ajax theo mặc định được gửi với bất kỳ cookie xác thực nào do trang đích nhắm mục tiêu. Ví dụ, giả sử tôi vô tình tải http://evil.com/, gửi yêu cầu cho http://mail.google.com/. Nếu không có SOP và tôi đã đăng nhập vào Gmail, tập lệnh tại evil.com có thể thấy hộp thư đến của tôi. Nếu trang web tại evil.com muốn tải mail.google.com mà không có cookie của tôi, nó chỉ có thể sử dụng máy chủ proxy; nội dung công khai của mail.google.com không phải là bí mật (nhưng nội dung của mail.google.com khi được truy cập bằng cookie của tôi bí mật).

(Lưu ý rằng tôi đã nói "nội dung chứng chỉ hạn chế", nhưng nó cũng có thể là topology-restricted content khi một trang web là chỉ hiển thị cho các địa chỉ IP nhất định.)

Đôi khi, tuy nhiên, nó không phải evil.com cố gắng để nhìn vào hộp thư đến của bạn. Đôi khi, nó chỉ là một trang web hữu ích (ví dụ: http://goodsite.foo) cố gắng sử dụng API công khai từ một nguồn gốc khác (giả sử, http://api.example.com). Các lập trình viên làm việc chăm chỉ trên api.example.commuốn tất cả các nguồn gốc để truy cập nội dung trang web của họ một cách tự do. Trong trường hợp đó, máy chủ API tại api.example.com có thể sử dụng tiêu đề CORS để cho phép goodsite.foo (hoặc bất kỳ nguồn gốc yêu cầu nào khác) truy cập các phản hồi API của nó. Vì vậy, tổng hợp, chúng tôi giả định theo mặc định rằng quyền truy cập nguồn gốc chéo là một điều xấu (nghĩ đến ai đó đang cố gắng đọc hộp thư đến của bạn), nhưng có những trường hợp là điều tốt (suy nghĩ về một trang web đang cố gắng để truy cập API công khai). CORS cho phép trường hợp tốt xảy ra khi trang web được yêu cầu muốn nó xảy ra.

+0

Vì vậy, trình duyệt vẫn phải gửi một số loại yêu cầu tới tất cả các trang web để xem liệu chúng có 'CORS' tiêu đề, phải không? Nếu 'evil.com' có tập lệnh truy cập vào trang web ngân hàng của tôi, trình duyệt của tôi có gửi yêu cầu kiểm tra hay một thứ gì đó để kiểm tra các tiêu đề đó, trong khi không đính kèm cookie của tôi không? – CodyBugstein

+0

@Imray Có, các yêu cầu được thực hiện ở cấp độ mạng; các kết quả đơn giản không được hiển thị cho JavaScript nếu kiểm tra CORS không thành công. Xem câu trả lời của tôi trên [Tiêu đề Access-Control-Allow-Origin hoạt động như thế nào?] (Http://stackoverflow.com/questions/10636611/how-does-access-control-allow-origin-header-work/10636765#10636765) (xin lỗi vì đã liên kết với nội dung của riêng tôi, nhưng đó là câu hỏi tôi đã trả lời vài lần trước đây và câu trả lời được liên kết là (tôi hy vọng) có liên quan đến câu hỏi của bạn) – apsillers

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