Небезпечна спроба JavaScript отримати доступ до кадру з URL-адресою


112

Я отримую помилку нижче, коли я намагаюся встановити хеш-значення для батьківського URL з iframe, який містить інший URL домену:

Небезпечна спроба JavaScript отримати доступ до кадру з URL-адресою "URL1" з кадру з URL-адресою "URL2". Домени, протоколи та порти повинні відповідати.

Як я можу виправити цю проблему?


3
Будь ласка , додайте більше деталей, фрагменти коду, повідомлення про помилку, структура використовується .. Більш багатослівність, більш детально ..
fifigyuri

5
Що робити, коли ви реалізуєте g + 1, facebook like або shre та щебетати соціальні плагіни, які завантажуються у iframe та кидають ту саму помилку?

Питання: Чому сценарії Facebook і Google навіть ПРАВИТИ, щоб отримати доступ до елементів мого веб-сайту.
sergio

Відповіді:


124

З дочірнього документа різного походження вам заборонено доступ до location.hashвласності верхнього вікна , але ви можете встановити сам locationресурс.

Це означає, що з огляду на те, що місце розташування у верхньому вікні http://example.com/page/, а не робити

parent.location.hash = "#foobar";

вам потрібно знати місцезнаходження батьків і робити

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

Оскільки ресурс не переміщується, він буде працювати, як очікувалося, змінивши лише хеш-частину URL-адреси.

Якщо ви використовуєте це для міждоменного спілкування, то рекомендую натомість використовувати easyXDM .


13
Ніхто не відзначив це як відповідь, і все ж він має 60 оновлень. Для цього має бути знак.
zachzurn

35
Як називався б знак? "
Відповів

1
Привіт @atul, будь ласкавим і познач цю відповідь найкращою. Будьте з повагою до умов, які дозволяють усім нам скористатися знаннями інших людей ...
Клінт Іствуд

13

Кроссфрейм-сценарій неможливий, коли два кадри мають різні домени -> Безпека.

Дивіться це: http://javascript.about.com/od/reference/a/frame3.htm

Тепер, щоб відповісти на ваше запитання: не існує рішення чи вирішувати проблеми, просто слід перевірити дизайн веб-сайту, чому повинні бути два кадри з різних доменів, що змінює URL-адресу іншого.


82
Це часта вимога, коли на ваш веб-сайт вбудовується програма сторонніх розробників, особливо там, де веб-сервіси тощо не є можливим.
Жак

9

Я отримував те саме повідомлення про помилку, коли я намагався порушити домен для iframe.src.

Для мене відповідь полягала в тому, щоб змінити iframe.src на URL на домен SAME, але це фактично сторінка перенаправлення html на потрібний домен. Потім інший домен з’явився в моєму iframe без помилок.

Працював як шарм. :)


Ви могли б детальніше розповісти, що саме ви тут зробили?
Devin G Rhode

було б дуже корисно, якщо ви можете коротко пояснити.
Мадхусудхан

2
Не працює в останньому Chrome: він не перевіряє параметр src, але завантажується фактична URL-адреса. Тож фокус із переадресацією, на жаль, жодним чином не допомагає :-(
lucaferrario

3
Я вважаю, що Томмі має на увазі проксі-сервер. Див., Наприклад, benalman.com/projects/php-simple-proxy або developer.yahoo.com/javascript/howto-proxy.html або google.com/… або рішення Рене де Кат на сайті stackoverflow.com/a/11224975/27938
Oskar Austegard

Це акуратно. Але це просто ілюструє, як загалом тривіально це обійти. Гаразд, припустимо, що я злий шкідливий хакер, і я хочу запускати міждоменні скриптингові атаки. Ймовірно, я буду знати про ці інструменти та використовувати їх. Що стосується виправлень безпеки браузера, це легко настільки ж відстало, як IE, не дозволяючи вам запускати Javascript локально без попередження. Не вирішує жодної проблеми. Створює купу нових.
Іцхак

6

Рішенням може бути використання локального файлу, який витягує віддалений вміст

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
Це відкриває двері для вразливих сценаріїв сценаріїв між сайтами. Приклад можливої ​​атаки: 1. Я створюю сторінку myevilserver.com, яка виглядає так само, як ваш сайт, включаючи форму для входу, яку POST повертає на myevilserver.com 2. Я розсилаю вашим користувачам підроблений інформаційний бюлетень із посиланням на https: // tvojeite.com/remoteInclude.php?url=myevilserver.com 3. Вони бачать на вашому веб-сайті форму входу, яку я фіксую на своєму сервері.
EricP

2
Можливе рішення - змусити remoteInclude.php перевірити всі URL-адреси на попередньо затверджений список доменів.
EricP

Це не вирішує проблеми з уразливістю сценаріїв міжсайтового сценарію. Я абсолютно нічого не можу зробити з Javascript на зовнішньому веб-сайті, що я не можу зробити з боку сервера. Все це робить перешкоду для самого браузера та робить веб-додатки менш корисними, вводячи додатковий крок. Ви все ще можете робити все це, якщо ви завантажуєте через ajax, переписуєте посилання та публікуєте повідомлення назад. Якщо це не працює, віддаліть rpc через php або будь-якою іншою мовою. Абсурдно, що це навіть питання для пересічного кодера.
Іцхак

3

Я виявив, що використання цієї версії XFBML у Facebook як кнопка, а не версія HTML5 вирішило цю проблему. Додайте код нижче, де ви хочете, щоб кнопка з’явилася:

<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>

Потім додайте це до свого тегу HTML:

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

2
Що стосується Facebook з цим питанням?
Куккс

16
Тому що ви також отримуєте цю помилку у фейсбуці, як кнопки, і я знайшов цю сторінку під час пошуку відповіді, щоб подумати, що іншим може знадобитися відповідь.
Люк Олдертон

1

Проблема навіть у тому випадку, якщо ви створили проксі-сервер або завантажуєте вміст і вводите його як би локальний, будь-які сценарії, визначені цим вмістом, завантажуватимуться з іншого домену та спричинять проблеми між доменними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.