2011-11-10 29 views
23

Tôi có một biểu mẫu xác thực phổ biến trên nhiều tên miền phụ (example.com, blog.example.com và app.example.com). Biểu mẫu đăng nhập phải nộp dữ liệu này để example.com không phụ thuộc vào nơi nó được hiển thị, vì vậy tôi nghĩ đến việc sử dụng CORS, nhưng điều này:Chia sẻ tài nguyên nguồn gốc chéo với thông tin xác thực

header("Access-Control-Allow-Origin: http://example.com http://blog.example.com http://app.example.com") 

does not work

Vì vậy, tôi nghĩ đến việc làm điều tiếp theo, và kiểm tra header xứ bằng tay trên phía máy chủ, và cho phép một Access-Control-Allow-Origin: * để yêu cầu có thể được thực hiện, nhưng không may, điều này cây trồng lên in the MDN

Lưu ý quan trọng: khi trả lời một yêu cầu chứng nhận, máy chủ phải xác định một miền, một nd không thể sử dụng thẻ hoang dã.

Có cách nào để yêu cầu của tôi hoạt động trên nhiều miền và vẫn gửi thông tin đăng nhập bằng CORS không?

+0

Tôi tin rằng bạn cũng có thể đặt dấu phẩy giữa các tên miền. (nghĩa là, vâng, bạn có thể làm cho nó hoạt động trên nhiều tên miền.) – BrainSlugs83

+1

Tôi không nghĩ vậy. Từ thông số: > Trong thực tế, việc sản xuất danh sách gốc hoặc không có nhiều hạn chế hơn. Thay vì cho phép một danh sách các nguồn gốc được phân tách bằng dấu cách, nó là một nguồn gốc duy nhất hoặc chuỗi "null". [source] (https://www.w3.org/TR/cors/#access-control-allow-origin-response-header) – Nemo

Trả lời

34

Hai ý nghĩ:

1) bạn có bao gồm tiêu đề "Access-Control-Allow-Credentials: true" không? Điều này là cần thiết để truyền thông tin xác thực cookie (và ứng dụng XHR tương ứng phải được đặt .withCredentials = true)

2) Bạn đã thử đề xuất từ ​​liên kết của mình và chỉ bao gồm nguồn gốc cho yêu cầu hiện tại. Ví dụ: nếu yêu cầu xuất hiện với tiêu đề "Xuất xứ: http://blog.example.com", bạn sẽ trả lời bằng "Access-Control-Allow-Origin: http://blog.example.com" và không phải là danh sách nguồn gốc. Điều này đòi hỏi một ít công việc hơn về việc thực hiện phía máy chủ của bạn.

3) Một suy nghĩ khác, bạn đề cập rằng bạn có một biểu mẫu đăng nhập duy nhất phải được chia sẻ bởi nhiều miền khác nhau. Vâng, nếu đó là biểu mẫu HTML chuẩn, bạn có thể thực hiện một bài đăng biểu mẫu thông thường trên các tên miền. Bạn không cần phải sử dụng CORS. Chỉ cần đặt thuộc tính "hành động" của biểu mẫu thành url bạn muốn đăng. Ví dụ:

<form name="login" action="http://login.example.com/doLogin"> 
+0

Tôi đã sử dụng (2). Bằng cách nào đó tôi đã bỏ qua phương pháp gốc duy nhất. – Nemo

1
// cross domain 
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']); 
header('Access-Control-Allow-Credentials: true'); 
+6

Đừng làm điều đó mà không cần xác minh nghiêm ngặt tiêu đề Xuất xứ hoặc bạn sẽ mở lỗ hổng bảo mật – Tom

+3

Câu trả lời này minh họa lý do tại sao không thể có bảo mật chống lừa đảo - thậm chí cả trong kỹ thuật! >. < – BrainSlugs83

+0

OK xuất hiện rằng đây là "trong bản chất" giống như làm "*" mà có thể mở ra lỗ hổng bảo mật tinh tế như vậy là nản lòng, xem http://stackoverflow.com/questions/12001269/what-are-the- security-risk-of-setting-access-control-allow-origin – rogerdpack

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