2008-10-23 46 views
17

Tôi có một trang web, foo.com, yêu cầu ajax tới bar.foo.com. Điều này sẽ làm việc.AJAX, Tên miền phụ và SSL

Ngoài ra, nếu foo là kết nối an toàn, https, bar.foo.com có ​​cần phải https không? Hai trang web này có thể sử dụng các chứng chỉ khác nhau không?

Trả lời

0

Hầu hết các trình duyệt sẽ tùy thuộc vào cài đặt bảo mật/quyền riêng tư của họ, chặn mọi cuộc gọi bên ngoài được thực hiện - và chỉ cho phép các cuộc gọi AJAX được thực hiện cho cùng một miền. Ngay cả các tên miền phụ cũng bị chặn, bởi vì trên các môi trường chia sẻ, chúng có thể gây ra một mối đe dọa thực sự.

Tóm lại: chỉ thực hiện cuộc gọi AJAX thông qua cùng một tên miền (có thể gọi một trang, lần lượt gọi trang khác từ tên miền khác - thông qua curl/fopen/...) hoặc bạn sẽ gặp rắc rối. Điều đó cũng trả lời câu hỏi SSL của bạn - không quan trọng bạn đang sử dụng SSL nào, hoặc liệu chúng có giống nhau hay không - các cuộc gọi sẽ bị chặn, mặc dù SSL.

0

Có, bạn có thể nhận các chứng chỉ khác nhau cho cả hai miền. Đó là tất cả trong cách bạn quyết định cấu hình nó.

Bạn có thể định cấu hình máy chủ web cho foo.com và bạn có thể mở cổng 80 để bảo mật và cổng 443 để bảo mật và sử dụng cả hai.

Bạn có thể định cấu hình máy chủ web khác cho bar.foo.com và thực hiện các cấu hình cổng tương tự.

Nếu bạn cần đảm bảo rằng bạn được bảo mật trên cả hai thì bạn cần nhận chứng chỉ cho mỗi miền khác nhau.

Bạn có thể mua chứng chỉ * .foo.com để cho phép bạn sao chép chứng chỉ này sang trang web khác và sử dụng chứng chỉ đó.

Bất kể nếu yêu cầu của bạn liên kết đến http://bar.foo.com, bạn sẽ không có kết nối an toàn.

Bạn phải có http "s" để yêu cầu máy chủ web sử dụng cổng 443 và cố gắng xác thực chứng chỉ.

Tất cả các chứng chỉ thực sự là nói rằng nguồn được tin cậy. Ngay cả khi nó không được tin cậy và bạn sử dụng http "s" và có một khóa trên trình duyệt, dữ liệu của bạn vẫn được mã hóa.

22

Với AJAX thuần-http: Bạn đang nói về thực hiện XMLHttpRequest nhiều miền, không được trình duyệt cho phép. Có W3C proposal pending để thực hiện điều này một cách an toàn trong tương lai (được thực hiện một phần bởi IE8, IIRC), nhưng chắc chắn là không thể hiện tại.

Tuy nhiên, cách giải quyết cho làm việc đó một cách an toàn: Subspace (trong đó sử dụng iframe và document.domain), các fragment identifier technique (một lần nữa, sử dụng iframe) và window.name technique (một lần nữa, iframe!).

Theo như SSL đi, bạn có thể mua chứng chỉ riêng cho tên miền và tên miền phụ hoặc chứng chỉ ký tự đại diện (* .foo.com) bao gồm cả hai (tự nhiên, ký tự đại diện sẽ đắt hơn).

Nếu bạn có trang HTTPS yêu cầu các mục từ các miền khác, tất cả sẽ được miễn là mọi thứ đều là HTTPS. Điều đó có nghĩa là nếu bạn sử dụng một trong các cách giải quyết iframe, bạn phải chỉ định URL lược đồ https:// trong thuộc tính src của khung nội tuyến.

Giải pháp cuối cùng, kém hiệu quả hơn là có một tập lệnh trên https://foo.com rằng các proxy yêu cầu không an toàn http://bar.foo.com.(Điều này cũng giải quyết vấn đề miền chéo XHR, vì vậy bạn có thể bỏ qua các giải pháp khác.) Tất nhiên, điều đó có nghĩa là bạn đang gửi yêu cầu XHR đến https://foo.com/someurl, sau đó nhấn http://bar.foo.com/someurl, nhận phản hồi và gửi lại trình duyệt , vì vậy hiệu suất-khôn ngoan bạn tốt hơn nhiều chỉ cần di chuyển các chức năng phía máy chủ của bar.foo.com vào foo.com, nếu bạn có tùy chọn đó. Nhưng nếu bạn không thể di chuyển kịch bản máy chủ thì proxy là cách để đi.

EDIT: Tôi đã thay đổi 3 grafs cuối cùng sau khi thực hiện một số thử nghiệm bổ sung và nhận được một khung công tác AJAX iframe (#fragmentidentifier one) để hoạt động trên các miền HTTPS khác nhau. Bạn có thể làm AJAX tên miền chéo bằng cách sử dụng iframe miễn là mọi thứ đều là https và lược đồ https được sử dụng trong iframe src. Tóm tắt:

  1. Câu trả lời ngắn: không có, đúng XHR cross-domain không được phép
  2. Cách giải quyết với iframe: hiệu quả hơn, cần 2 SSL Certs (hoặc cert ký tự đại diện), hơi phức tạp
  3. Cách giải quyết với proxy: kém hiệu quả, có thể làm với 1 hoặc 2 SSL certs (1 với yêu cầu phụ trợ để bar.foo.com qua http), hơi phức tạp
0

Bạn có thể cùng mbine JavaScript TLS và Flash để thực hiện các yêu cầu miền chéo an toàn. Bằng cách này, khách truy cập của bạn truy cập vào https://foo.com và bạn có thể đặt XmlHttpRequests thành https://bar.foo.com. Bạn có thể làm điều tương tự với http thông thường.

Bạn sẽ cần phải mua chứng chỉ SSL mà trình duyệt của khách truy cập sẽ tin cậy cho foo.com, nhưng bạn có thể tạo chứng chỉ SSL của riêng mình cho bar.foo.com, bar2.foo.com, v.v. để tạo chứng chỉ SSL của riêng bạn (miễn phí) là mua chứng chỉ SSL ký tự đại diện cho * .foo.com. Nhưng nếu bạn chỉ thực hiện các yêu cầu miền chéo cho các trang web đó thông qua foo.com thì bạn không cần phải chi thêm tiền mặt đó.

Kiểm tra các opensource dự án Forge trên github:

http://github.com/digitalbazaar/forge/blob/master/README

Các liên kết trên blog ở cuối cung cấp một sâu sắc hơn lời giải thích.

0

Có bạn chắc chắn nhất có thể thực hiện gửi qua ajax miền chéo. Chúng tôi đã thực hiện chính xác cùng một thiết lập bằng cách sử dụng ssl.com wildcard cert nhưng bạn có thể sử dụng 2 chứng chỉ tiêu chuẩn trên 2 trang web.

Về cơ bản bạn sẽ sử dụng JSONP (yahoo, google, fb, v.v ... sử dụng tính năng này). Giá trị trả lại được gói trong một hàm amd trông giống như

someFunction("{...}"); 
Các vấn đề liên quan