2012-07-02 38 views
10

Tôi đang làm việc trên ứng dụng web dành cho thiết bị di động và jsonp khá thú vị đối với yêu cầu miền chéo, nhưng API của máy chủ không hỗ trợ tham số gọi lại. Vì vậy, tôi chỉ có thể sử dụng json để lấy dữ liệu từ máy chủ từ xa.jQuery - Cách xóa giới hạn miền chéo

Tôi đã thử json trong jQuery, có vẻ như nó không hỗ trợ yêu cầu miền chéo. Tôi đã thử chức năng yêu cầu ajax thô trên safari, và nó hoạt động tốt trên tên miền chéo, vì vậy tôi có thể loại bỏ giới hạn của tên miền chéo cho yêu cầu json trong jQuery? (không phải jsonp, chỉ json), và làm thế nào để làm điều đó?

Hoặc có thư viện ajax đơn giản thay thế nào (trình duyệt web chéo) và có thể thực hiện yêu cầu về tên miền chéo.

+1

Bạn sẽ có thể tìm câu trả lời cho câu hỏi của bạn trong số các câu trả lời cho [Các cách để phá vỡ chính sách cùng nguồn gốc] (http://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy). Câu hỏi của bạn có vẻ cơ bản giống nhau. –

+0

Tôi đang sử dụng YQL + jQuery để truy cập nội dung miền chéo. –

Trả lời

31

Cùng xứ Chính sách

Bạn đang cố gắng phá vỡ Same Origin Policy. Nó được tích hợp vào mọi trình duyệt và thường không phải là thứ mà bạn có thể hoặc nên vô hiệu hóa/giải pháp/etc. Đây là một hợp đồng bảo mật rất quan trọng giữa trang web của bạn, người dùng và trình duyệt của người dùng.

CORS (có thể)

CORS cho phép máy chủ web của bạn để cho trình duyệt/khách hàng truy cập vào tên miền khác là cho phép. Điều này được thực hiện bằng cách có đầu ra tiêu đề HTTP sau bởi máy chủ web của bạn

Access-Control-Allow-Origin: http://www.example.com 

Nếu bạn không thể kiểm soát tiêu đề HTTP, thì bạn không thể sử dụng CORS. Thực hiện điều này là ngôn ngữ/khung công cụ cụ thể.

Xin lưu ý rằng bạn nên kiểm tra để đảm bảo browser compatibility vì IE8/9 có hỗ trợ giới hạn. Cũng lưu ý rằng đây là một vector tấn công tiềm năng. Nó cho phép phản hồi từ các trang web của bên thứ ba để thực thi các cuộc tấn công XSS nếu bạn sử dụng dữ liệu phản hồi vô trách nhiệm.

JSONP (có thể)

JSONP là một cách thông minh để vượt qua và lấy dữ liệu giữa các máy chủ bằng cách tự động thêm một thẻ script với một atrribute src bằng "yoururl.com?<your parameter data>" vào trang của bạn. Đó là cách hợp pháp duy nhất để thực hiện một kỳ công như vậy mà không cần proxy web (xem bên dưới) hoặc một applet (Flash/Java). Tuy nhiên, nó có rủi ro bảo mật riêng nếu bạn không phải là nhà cung cấp cả hai đầu yêu cầu. Hãy nhớ rằng JSONP cho phép máy chủ từ xa thực thi mã trong ngữ cảnh của bạn và bạn phải là very careful who you give that power to.

"Vanilla" AJAX (không thể)

Nếu bạn không sử dụng JSONP để lấy dữ liệu thì bạn có nhiều khả năng cố gắng sử dụng một yêu cầu AJAX để lấy dữ liệu. Yêu cầu AJAX cũng phải tuân theo Chính sách xuất xứ tương tự. Các thư viện JavaScript (ví dụ: jQuery, Prototype, Dojo, v.v.) không thể phá vỡ chính sách này làm hành vi cơ sở cho một yêu cầu Ajax. Họ có thể, tuy nhiên, hỗ trợ JSONP (mà nhớ bây giờ, không phải là AJAX).

AJAX w/Web Proxy (có thể)

Nếu bạn muốn yêu cầu dữ liệu từ máy chủ khác, bạn có thể chuyển tiếp yêu cầu của bạn. Máy chủ trang web chính của bạn sẽ hoạt động như một proxy.Bạn sẽ cần phải thực hiện một yêu cầu AJAX cho máy chủ của riêng bạn, mã phía máy chủ đó sau đó sẽ thực hiện một yêu cầu đến miền khác và sau đó gửi phản hồi cho tập lệnh của bạn thông qua phản hồi cuộc gọi AJAX.

Đây là mẫu phổ biến và được mô tả chi tiết ở đây là Web Proxy Pattern và một hình ảnh thân thiện với Yahoo here (but remember it's Yahoo specific, just take the general idea). Tuy nhiên, phụ thuộc vào ngôn ngữ phía máy chủ. Việc thực hiện tổng thể sẽ giống nhau, tuy nhiên mã để làm như vậy sẽ thay đổi dựa trên ngôn ngữ phía máy chủ của bạn lựa chọn (PHP, Ruby, Python, C, v.v.). Một số ngôn ngữ sẽ có các thư viện/mô-đun/etc để hỗ trợ một mẫu như vậy.

Flash (có thể, không phải mặc định)

Flash trong trạng thái mặc định của nó không hỗ trợ các yêu cầu miền chéo. Nó có thể được bật trong Flash7 + với cross-domain policy files nhưng được đề xuất cao. Kịch bản của bạn sẽ phải giao diện với một API Flash có thể đưa ra các yêu cầu và trả lại dữ liệu cho JavaScript của bạn.

Java Applet (có thể, không phải mặc định)

Java cũng là đối tượng của chính sách cùng một nguồn gốc, nhưng có một công việc tương tự xung quanh sang Flash như described here on its release.

khác nhau khác "hack"

Có hack khác trên mạng, nhưng họ thường yêu cầu bạn phải kiểm soát cả hai đầu hoặc có thoả thuận tiêu chuẩn cho truyền thông. Ví dụ: hack 'window.name'. Tôi không đề nghị hầu hết các phương pháp này.

Solutions khác

Một câu hỏi tương tự như điều này đã được yêu cầu. Nó vạch ra một vài phương pháp khác mà tôi đã không bao gồm: Ways to circumvent the same-origin policy

Các giải pháp tốt nhất

  1. CORS - nếu bạn tin tưởng vào bên thứ 3
  2. Web Proxy - nếu bạn không

Một proxy web trên tên miền của riêng bạn có thể cho phép bạn khử trùng dữ liệu được truy xuất, nó cung cấp cho người dùng sự bảo vệ nhất. Tuy nhiên, nếu bạn không làm vệ sinh thì không an toàn hơn bất kỳ phương pháp nào được nêu ở đây. Nếu bạn thực hiện một proxy web của một số loại, hãy chắc chắn rằng yêu cầu của nó được giới hạn và từ các trang web bạn muốn. Khác bạn về cơ bản sẽ được tạo ra một open proxy, có thể bị lạm dụng bởi người dùng nếu phát hiện và giúp bạn gặp rắc rối pháp lý.

4

Một cách khá dính để làm việc đó sẽ là những gì tôi đã làm dưới đây để cho phép thực hiện qua trang web trên một dự án cá nhân

xin lưu ý điều này sẽ được thực hiện trên máy chủ nhận được không phải là gửi một

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') === FALSE) 
     die('You shouldn\'t be here'); 

    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); 
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
    header('Access-Control-Max-Age: 1000'); 
    header('Access-Control-Allow-Headers: Content-Type'); 

nếu bạn muốn nó được nhiều hơn một chút an toàn, bạn có thể làm

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') === FALSE) 
     die('You shouldn\'t be here'); 

switch($_SERVER['HTTP_ORIGIN']){ 
case 'domain.com': 
case 'whatever.com': 
     header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); 
     header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
     header('Access-Control-Max-Age: 1000'); 
     header('Access-Control-Allow-Headers: Content-Type'); 
} 

Hope this helps nó đã cho tôi mãi mãi để con nó ra lol.

+8

Bạn có thể thêm một số [tham chiếu] (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) vào phương pháp bạn mô tả, cụ thể là [CORS] (http://www.w3.org/TR/ cors /). –

6

Tôi gặp vấn đề tương tự. Đang cố gắng lấy json từ một máy chủ mà tôi không có quyền truy cập (=> không có JSONP).

Tôi đã tìm thấy http://benalman.com/projects/php-simple-proxy/ Thêm proxy php vào máy chủ của bạn và thực hiện cuộc gọi ajax tới tệp này. "Bất kỳ tham số GET nào được chuyển tới tài nguyên URL từ xa phải được mã hóa url trong tham số này".

$.ajax({ 
    type: 'GET', 
    url:'proxy.php?url=http://anyDomain.com?someid=thispage', 
    dataType: "json", 
    success: function(data){ 
     // success_fn(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // error_fn(jqXHR, textStatus, errorThrown); 
    } 
}); 

nơi proxy.php (các tập tin từ Bến Alman) được lưu trữ trong phạm vi của bạn


Alternative (mà tôi tìm thấy là thứ hai tốt nhất để này): http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

+0

Tốt nhất, cảm ơn! – Tom

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