các document.domainphương pháp
- Kiểu phương thức: iframe .
Lưu ý rằng đây là phương thức iframe đặt giá trị của document.domain thành hậu tố của tên miền hiện tại. Nếu đúng như vậy, tên miền ngắn hơn được sử dụng cho các lần kiểm tra gốc khác. Ví dụ: giả sử tập lệnh trong tài liệu http://store.company.com/dir/other.htmlthực thi câu lệnh sau:
document.domain = "company.com";
Sau khi câu lệnh đó được thực thi, trang sẽ vượt qua kiểm tra gốc http://company.com/dir/page.html. Tuy nhiên, với lý do tương tự, company.com không thể đặt document.domain thành othercompany.com.
Với phương pháp này, bạn sẽ được phép thoát javascript từ iframe có nguồn gốc trên một tên miền phụ trên một trang có nguồn gốc trên tên miền chính. Phương pháp này không phù hợp với tài nguyên tên miền chéo vì các trình duyệt như Firefox sẽ không cho phép bạn thay đổi document.domaintên miền hoàn toàn xa lạ.
Nguồn: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Phương pháp chia sẻ tài nguyên chéo
Chia sẻ tài nguyên nguồn gốc chéo (CORS) là Dự thảo hoạt động của W3C xác định cách trình duyệt và máy chủ phải giao tiếp khi truy cập các nguồn qua nguồn gốc. Ý tưởng cơ bản đằng sau CORS là sử dụng các tiêu đề HTTP tùy chỉnh để cho phép cả trình duyệt và máy chủ biết đủ về nhau để xác định xem yêu cầu hoặc phản hồi nên thành công hay thất bại.
Đối với một yêu cầu đơn giản, một yêu cầu sử dụng một GEThoặc POSTkhông có tiêu đề tùy chỉnh và cơ thể của ai text/plain, yêu cầu được gửi với một tiêu đề bổ sung được gọi Origin. Tiêu đề Origin chứa nguồn gốc (giao thức, tên miền và cổng) của trang yêu cầu để máy chủ có thể dễ dàng xác định liệu nó có nên phục vụ phản hồi hay không. Một Origintiêu đề ví dụ có thể trông như thế này:
Origin: http://www.stackoverflow.com
Nếu máy chủ quyết định rằng yêu cầu nên được cho phép, nó sẽ gửi một Access-Control-Allow-Origintiêu đề lặp lại cùng một nguồn gốc đã được gửi hoặc *nếu đó là một tài nguyên công cộng. Ví dụ:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Nếu tiêu đề này bị thiếu hoặc nguồn gốc không khớp, thì trình duyệt sẽ không cho phép yêu cầu. Nếu tất cả đều ổn, thì trình duyệt sẽ xử lý yêu cầu. Lưu ý rằng cả yêu cầu và phản hồi đều không bao gồm thông tin cookie.
Nhóm Mozilla gợi ý trong bài đăng của họ về CORS rằng bạn nên kiểm tra sự tồn tại của withCredentials tài sản để xác định xem trình duyệt có hỗ trợ CORS thông qua XHR không. Sau đó, bạn có thể kết hợp với sự tồn tại của XDomainRequestđối tượng để bao trùm tất cả các trình duyệt:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Lưu ý rằng để phương thức CORS hoạt động, bạn cần có quyền truy cập vào bất kỳ loại cơ chế tiêu đề máy chủ nào và không thể truy cập bất kỳ tài nguyên của bên thứ ba nào.
Nguồn: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-shishing/
các window.postMessagephương pháp
- Kiểu phương thức: iframe .
window.postMessage, khi được gọi, sẽ khiến một MessageEventlệnh được gửi ở cửa sổ đích khi bất kỳ tập lệnh đang chờ xử lý nào phải được thực thi hoàn thành (ví dụ: các trình xử lý sự kiện còn lại nếu window.postMessageđược gọi từ một trình xử lý sự kiện, thời gian chờ được đặt trước đó, v.v.). Thông báo MessageEventcó loại thông báo, thuộc datatính được đặt thành giá trị chuỗi của đối số đầu tiên được cung cấp cho window.postMessage, thuộc origintính tương ứng với nguồn gốc của tài liệu chính trong cửa sổ gọi window.postMessagevào thời điểm đó window.postMessagevà thuộc sourcetính là cửa sổ từ đó window.postMessageđược gọi.
Để sử dụng window.postMessage, một trình lắng nghe sự kiện phải được đính kèm:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
Và một receiveMessagehàm phải được khai báo:
function receiveMessage(event)
{
// do something with event.data;
}
Iframe ngoài trang web cũng phải gửi các sự kiện đúng cách thông qua postMessage:
<script>window.parent.postMessage('foo','*')</script>
Bất kỳ cửa sổ nào cũng có thể truy cập phương thức này trên bất kỳ cửa sổ nào khác, bất cứ lúc nào, bất kể vị trí của tài liệu trong cửa sổ, để gửi tin nhắn. Do đó, bất kỳ người nghe sự kiện nào được sử dụng để nhận tin nhắn trước tiên phải kiểm tra danh tính của người gửi tin nhắn, bằng cách sử dụng các thuộc tính nguồn gốc và có thể là nguồn. Điều này không thể được nhấn mạnh: Không kiểm tra các thuộc tính originvà có thể sourcecho phép các cuộc tấn công kịch bản chéo trang.
Nguồn: https://developer.mozilla.org/en/DOM/window.postMessage