các document.domain
phươ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.html
thự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.domain
tê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 GET
hoặc POST
khô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 Origin
tiê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-Origin
tiê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.postMessage
phương pháp
- Kiểu phương thức: iframe .
window.postMessage
, khi được gọi, sẽ khiến một MessageEvent
lệ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 MessageEvent
có loại thông báo, thuộc data
tí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 origin
tí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.postMessage
vào thời điểm đó window.postMessage
và thuộc source
tí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 receiveMessage
hà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 origin
và có thể source
cho 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