JavaScript không an toàn cố gắng truy cập khung có URL


112

Tôi gặp lỗi dưới đây khi cố gắng đặt giá trị băm cho url mẹ từ iframe chứa url miền khác:

JavaScript không an toàn cố gắng truy cập khung có URL "URL1" từ khung có URL "URL2". Tên miền, giao thức và cổng phải phù hợp.

Làm cách nào để khắc phục sự cố này?


3
Vui lòng thêm chi tiết, các đoạn mã, thông báo lỗi, khung bạn sử dụng .. More cách rườm rà, thêm chi tiết ..
fifigyuri

5
Còn khi bạn triển khai các plugin xã hội g + 1, facebook like hoặc shre và twitter tải trong iframe và gặp lỗi tương tự?

Câu hỏi đặt ra là TẠI SAO các tập lệnh của Facebook và Google thậm chí đang THỬ để truy cập các phần tử trang web của tôi.
sergio

Câu trả lời:


124

Từ một tài liệu con có nguồn gốc khác, bạn không được phép truy cập vào thuộc location.hashtính của cửa sổ trên cùng , nhưng bạn được phép đặt thuộc locationtính đó.

Điều này có nghĩa là với vị trí cửa sổ trên cùng http://example.com/page/, thay vì làm

parent.location.hash = "#foobar";

bạn cần biết vị trí của cha mẹ và làm

parent.location = "http://example.com/page/#foobar";

Vì tài nguyên không được điều hướng, điều này sẽ hoạt động như mong đợi, chỉ thay đổi phần băm của url.

Nếu bạn đang sử dụng điều này cho giao tiếp giữa nhiều miền, thì tôi khuyên bạn nên sử dụng easyXDM để thay thế.


13
Không ai đánh dấu đây là câu trả lời và nó đã có 60 lượt ủng hộ. Nên có một huy hiệu cho điều này.
zachzurn

35
Huy hiệu sẽ được gọi là gì? "Đã trả lời là với một người lười biếng"
nzifnab

1
Này @atul, hãy tử tế và đánh dấu câu trả lời này là câu trả lời hay nhất. Hãy tôn trọng các quy ước cho phép tất cả chúng ta được hưởng lợi từ kiến ​​thức của người khác ...
Clint Eastwood

13

Crossframe-Scripting không thể thực hiện được khi hai khung có các miền khác nhau -> Bảo mật.

Xem phần này: http://javascript.about.com/od/reference/a/frame3.htm

Bây giờ để trả lời câu hỏi của bạn: không có giải pháp hoặc giải pháp nào xung quanh, bạn chỉ cần kiểm tra thiết kế trang web của mình tại sao phải có hai khung từ các tên miền khác nhau làm thay đổi url của tên khác.


82
Đây là một yêu cầu thường xuyên khi một người đang nhúng ứng dụng của bên thứ ba vào trang web của bạn, đặc biệt khi các dịch vụ web và những thứ tương tự không phải là một tùy chọn.
Jacques

9

Tôi đã nhận được thông báo lỗi tương tự khi cố gắng cắt bớt miền cho iframe.src.

Đối với tôi, câu trả lời là thay đổi iframe.src thành url trên miền CÙNG, nhưng đó thực sự là một trang chuyển hướng lại html đến miền mong muốn. Miền khác sau đó hiển thị trong iframe của tôi mà không có bất kỳ lỗi nào.

Làm việc như người ở. :)


bạn có thể nói rõ hơn về chính xác những gì bạn đã làm ở đây không?
Devin G Rhode

sẽ thực sự hữu ích nếu bạn có thể giải thích ngắn gọn.
Madhusudhan

2
Không hoạt động trong Chrome mới nhất: nó không kiểm tra tham số src mà là URL thực được tải. Vì vậy, các trick chuyển hướng không may không được giúp đỡ trong bất kỳ cách nào :-(
lucaferrario

3
Tôi tin rằng những gì Tommy đang đề cập đến là một proxy phía máy chủ. Xem ví dụ: benalman.com/projects/php-simple-proxy hoặc developer.yahoo.com/javascript/howto-proxy.html hoặc google.com/… hoặc giải pháp của René de Kat tại stackoverflow.com/a/11224975/27938
Oskar Austegard

Thật gọn gàng. Nhưng nó chỉ minh họa cho việc giải quyết vấn đề này nói chung là tầm thường như thế nào. Được rồi, hãy giả sử rằng tôi là một tin tặc xấu độc hại và tôi muốn thực hiện các cuộc tấn công tập lệnh tên miền chéo. Rất có thể tôi sẽ biết về những công cụ này và sử dụng chúng. Theo như các bản sửa lỗi bảo mật của trình duyệt, điều này dễ dàng bị chậm lại vì IE không cho phép bạn chạy Javascript cục bộ mà không có cảnh báo. Giải quyết không có vấn đề. Tạo một loạt những cái mới.
Yitzhak

6

Một giải pháp có thể là sử dụng tệp cục bộ lấy nội dung từ xa

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


1
Điều này mở ra cánh cửa cho các lỗ hổng tập lệnh trên nhiều trang web. Ví dụ về một cuộc tấn công có thể xảy ra: 1. Tôi tạo một trang trên myevilserver.com trông giống như trang web của bạn, bao gồm một biểu mẫu đăng nhập ĐĂNG lại myevilserver.com 2. Tôi gửi một bản tin giả cho người dùng của bạn với một liên kết tới https: // yourite.com/remoteInclude.php?url=myevilserver.com 3. Họ nhìn thấy biểu mẫu đăng nhập trên trang web của bạn mà tôi chụp trên máy chủ của mình.
EricP

2
Một giải pháp khả thi là làm cho remoteInclude.php kiểm tra tất cả các url dựa trên danh sách các miền đã được phê duyệt trước.
EricP

Điều này không giải quyết các vấn đề về lỗ hổng tập lệnh trang web chéo. Tôi hoàn toàn không thể làm gì với Javascript cho một trang web bên ngoài mà tôi không thể làm gì từ phía máy chủ. Tất cả những gì điều này làm là cản trở chính trình duyệt và làm cho các ứng dụng web trở nên kém hữu ích hơn bằng cách giới thiệu một bước bổ sung. Bạn vẫn có thể làm tất cả những điều này nếu bạn tải thông qua ajax, viết lại các liên kết và đăng lại. Nếu điều đó không hiệu quả, hãy rpc từ xa nó thông qua php hoặc bất kỳ ngôn ngữ nào. Thật vô lý khi đây thậm chí là một vấn đề đối với các coder bình thường.
Yitzhak

3

Tôi thấy rằng việc sử dụng phiên bản XFBML của nút thích Facebook thay vì phiên bản HTML5 đã khắc phục sự cố này. Thêm mã dưới đây vào nơi bạn muốn nút xuất hiện:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Sau đó, thêm cái này vào thẻ HTML của bạn:

 xmlns:fb="http://ogp.me/ns/fb#"

2
Facebook phải làm gì với câu hỏi này?
Kukks

16
Vì bạn cũng gặp lỗi này trên các nút like facebook và mình tìm thấy trang này khi tìm kiếm câu trả lời nên nghĩ có thể người khác cần câu trả lời.
Luke Alderton

1

Vấn đề là ngay cả khi bạn tạo proxy hoặc tải nội dung và đưa nó vào như thể nó cục bộ, thì bất kỳ tập lệnh nào mà nội dung đó xác định sẽ được tải từ miền khác và gây ra sự cố giữa nhiều miền.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.