логин: 
Другие записи за это число:
2011/10/16 - Ереван: отчет первый
2011/10/16_2 - давайте еще поговорим про JS?
<< предыдущая заметкаследующая заметка >>
16 октября 2011
Попытаю я вас про JS

Грипп догнал и меня сегодня — все дома болеют. Работать не хочется, неспешно ковыряю движок. Возник вопрос по JS. Первоначальный вопрос я вычеркнул — мне тут в комментах объяснили мою ошибку и сказали, что это невозможно — с разных доменов нельзя никак передавать информацию через #hash.

Но затем я все-таки обнаружил способ передавать информацию между разными доменами сквозь IFRAME. Для этого необходимо в IFRAME загрузить не саму страницу с чужого сайта, а сперва страницу со СВОЕГО сайта, где будет не iframe, а frame. Классический тупой frame — ужас дизайнеров прошлого века. И вот в этот фрейм уже можно загрузить страницу с ЧУЖОГО сайта. Не проблема такой файлик 1.htm сгенерировать, вставив туда нужный адрес чужой страницы:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<frameset><frame id='bubuka' src="http://binoniq.net/iframeo?adr=iframe_binoniq#pivko" name="bubuka"></frameset>
</html>

Чудо! Чужая страница теперь может (при желании и необходимой оснастке, разумеется) записывать в top#hash верхнего окна информацию (которую я могу оттуда читать), я могу записывать в ее #hash информацию, которую она прочесть сможет, ну и при помощи всякой обвязки можно организовывать их взаимодействие, например фрейм может попросить верхнее окно выставить ему такую высоту, какую хочет (это и была одна из целей изыскания). Проверил на Нокии E90 и на своем компе — работает. Мой комп, правда, может делать это и по протоколу postMessage, это прекрасное изобретение для того и предназначено. Но задача была поддерживать именно старые браузеры. Моделька: http://lleo.me/blog/if



БЫЛО:
Допустим, я загрузил свою страницу: www.lleo.url/1.htm#trololo, на которой два IFRAME, и они грузят с _чужих_ ресурсов еще две страницы: www.pupkin.url/1.htm#code=1234
www.hacker.url/1.htm#code=5678

На моей lleo.url, понятное дело, window === window.self === window.top

А у pupkin.url window.top !== window.self, для него не секрет, что его страница загружена кем-то в iframe. Он может через window.top.location.hash прочитать мое значение #trololo, может заменить его на #wowow без перезагрузки, и даже может отправить мое центральное окно гулять natribu.org. Это понятно.

Интересует следующее: может ли страница hacher.url/1.htm из своего IFRAME каким-то образом узнать, что рядом есть еще IFRAME pupkin.url? И прочитать его #code=1234?

Ответ интересен, потому что от этого сильно зависит модель безопасности.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Linux Safari Chrome
1
0
Швыня (#1089147)
А у pupkin.url window.top !== window.top, для него не секрет, что его страница загружена кем-то в iframe. Он может через window.top.location.hash прочитать мое значение #trololo, может заменить его на #wowow без перезагрузки, и даже может отправить мое центральное окно гулять natribu.org.

не может, именно из соображений безопасности

ответ на второй вопрос такой же
Linux Firefox
0
0
LLeo
Ах черт, вы правы. Только документы с родного сайта могут шевелить #hash Какая мерзость.
Linux Safari Chrome
0
1
maxim (#1030167)
> Он может через window.top.location.hash прочитать мое значение #trololo

Ничегошеньки внутренний ифрейм на другом домене не может сделать. Ни прочитать ничего с родительского окна, ни тем более поменять.
Linux Safari Chrome
0
0
maxim (#1030167)
Точнее про "#trololo" он может узнать, но не из window.top.location.hash (тут он получит access denied), а пропарсив document.referrer.

Update: тут я лажанул, в document.referrer не записывается hash, так что даже так не сможет про trololo узнать.
Windows Firefox
0
0
tealyatina
чтобы гарантировать безопасность, в iframe можно использовать атрибут sandbox. Я так понимаю, это не вариант. В таком случае, гарантировать нельзя.

вызов из фрейма следующего кода:
window.top.document.getElementsByTagName('iframe')

вернет все iframe в документе (т.е., на твоей странице).
А дальше уже получить значние атрибута srс у этих фреймов и распарсить его ничего не стоит.

Т.е., либо ограничиваешь возможности загруженной в iframe страницы через sandbox, нибо они будут творить че захотят.

upd. На счет того, что фрейм с другого домена пришел -- не факт, что браузер ему не даст доступ, Политику безопасности браузера можно настроить так, чтоб дал.
Linux Safari Chrome
3
0
Данил (#1196772)
попробуй easyXDM, и не заморачивайся как это работает во внутренностях. В зависимости от браузера (особенно если хочешь использовать старые версии) надо использовать разные транспорты между фреймами. Так что такие библиотеки помогают не думать об этом
Nokia-E90 Safari
3
0
LLeo Nokia E90 (#1165175)
Не думать - это не наш метод.

Я все сделал, что хотел, у меня все работает кроссбраузерно, 1 кб кода. Если бы при каждой такой ерунде я всякий раз брал непонятные библиотеки, проект бы превратился в тормознутое говно, состоящее из непонятных библиотек.
Windows Safari Chrome
0
0
Named (#1170544)
Извините, может, я чего-то не понимаю, но в Chrome 14 под виндой никакие хэши не прописываются.
Nokia-E90 Safari
0
0
LLeo Nokia E90 (#1165175)
Это в чем-то конкретно проявляется?

Впрочем, это не имеет никакого значения - Хром поддерживает новый протокол postMessage, а все эти пляски с бубнами нужны исключительно для тех браузеров, где этого еще нет.

Если вы про модельку - там сейчас просто запрещено использовать postMessage: if(0 && typeof postMessage == 'function') ... :)
Windows IE
1
4
lexyara
Очень плохо.
Никакой физической подготовки.
То с двухколесного велосипеда падаешь, то грипп догоняет.
Пора задуматься. Зарядочка с утра. Пробежечки. Обливания водой. :-)
Windows IE
0
0
D.iK.iJ
Толстый тролль
Windows IE
 Москва
0
0
AllaDimm
Да не в физической подготовке дело.
Это я виноват. Нельзя было позволить затащить себя в гости... Но я не был тверд, в результате (вероятно) притащил Леониду свежих вирусов.
Простите Леонид Александрович, я ведь честно предупреждал...
Windows IE
0
0
aterentiev (#1028039)
Единственная на данный момент, официально задокументированная и поддерживаемая всеми браузерами возможность передавать кросс-доменно информацию - JSONP. Все остальное - костыли.
Nokia-E90 Safari
0
0
LLeo Nokia E90 (#1165175)
Я ничего про это не знаю. Пробовал читать про JSON много раз, и всякий раз бросал, понимая, что к моим задачам он не подходит. Не помню точно, в чем там грабли.

То ли это не сам протокол, а лишь "удобная для разработчика среда разработки" поверх имеющегося соединения (а значит, не ответ на вопрос, как это соединение прокинуть).

То ли он обменивается данными лишь с родным сервером. А это мы и без него умеем гораздо проще.

То ли JSON не секюрен и позволяет чужому сайту ("блог Васи взломали") выполнить произвольный код JS-инъекции. Моя задача - построить систему, где это исключено.

В общем, я не помню, какая именно засада с JSON, но что-то из вышеперечисленного (или все сразу :) Я прав?
Windows IE
0
0
aterentiev (#1028039)
ключевое слово тут именно не JSON, а JSONP

рассматриваем ситуацию, когда страница с сервера на домене А хочет обмениваться данными с сервером с домена Б, и _сервер_домена_Б_не_против_
только такое возможно, ибо все остальные варианты - это "хаки" недокументированных возможностей из "серой зоны"

таким образом, запрос JSONP со страницы, открытой с А, содержит в себе определенный идентификатор, генерируемый на стороне клиента
сервер, знакомый с таким запросом, должен сгенерировать код JS функции с именно таким именем
страница, получив функцию, вольна ее выполнить (имя ей известно)

получается, что JS-инъекция "плохого кода" возможна только, если сервер Б вдруг решил взломать страницу А, как-то так...
Nokia-E90 Safari
0
0
LLeo Nokia E90 (#1165175)
Мне неясен вопрос, какой транспорт использует JSON. Это же не самостоятельный транспорт, встроенный в браузеры в виде метода json(url,data), верно?

Если json всего лишь сочиненный кем-то фреймфорк, который использует JS-инклюд [script src=http://чужой.сайт.js] - то зачем он вообще нужен? Это мы и сами всегда могли.

Но этот вариант неприемлем абсолютно - безопасность твоего сайта полностью зависит от чужого: если он умышляет злодейство или взломан, то пиздец.
Mac Firefox
0
0
vz (#1019696)
> Но этот вариант неприемлем абсолютно - безопасность твоего сайта полностью зависит от чужого: если он умышляет злодейство или взломан, то пиздец.

Если вы используете на своем сайте сторонние сервисы, то безопасность вашего сайта УЖЕ зависит от чужого.

На примере вашего решения: если сайт, открытый в iframe был «взломан или задумал злодейство», он может, например, произвольно менять hash и выполнять допустимые операции (тут ущерб зависит от того, насколько много в работе сайта завязано на эти хеши). Или может изменить не hash, а href (политика безопасности позволяет), перенаправляя пользователя на фишинговую страницу binonlq.net, чтобы украсть логины-пароли/попросить отправить платное смс/подсадить вирус. Ну или рекламу показать.
Mac Firefox
0
0
vz (#1019696)
Если нужно передавать информацию между разными поддоменами одного домена, то гораздо проще использовать не hash, а window.name. Делаете, например, в поддомене pupkin.lleo.me:
window.name = "Pupkin. Vasily Pupkin";
А в домене lleo.me читаете:
alert(window.name); // выдаст "Pupkin. Vasily Pupkin"

Если же перекидывать данные надо между разными доменами, то кроссбраузерным решением будут только JSONP или какие-нибудь костыли вроде easyXDM.
Nokia-E90 Safari
0
0
LLeo Nokia E90 (#1165175)
Если бы задача ограничивалась родным доменом, было бы все просто.

Насколько я помню, в этом случае даже разрешен доступ из родительского окна к содержимому страницы в ифрейме.
Windows Opera
0
0
Шура
я делал такую штуку, там все разрешено :)
Linux Firefox
0
0
LLeo
Вот тут выше мудрые люди посоветовали window.domain изменить, и тогда, дескать, все станет запрещено. Или указать другой протокол или порт. День прожит не зря, но это надо тестировать.
Linux Safari Chrome
0
0
Швыня (#1089147)
А вообще если стоит задача попросить родительский фрейм что-то сделать, то самый простой способ такой

1. обявляем в родителе жаваскриптовую функцию function doSomething() { ... }
2. во фрейме вызываем ее: parent.doSomething()
Nokia-E90 Safari
0
0
LLeo Nokia E90 (#1165175)
это не сработает для разных доменов, а речь именно о них
Windows Firefox
0
0
SelenIT (#1026951)
Два года назад во всём тогда мало-мальски актуальном работала такая уличная магия: http://dklab.ru/chicken/nablas/58.html (конечно, произвольную инфу так "простукивать" нереально, но "цель изыскания" вроде как была достигнута).

всего комментариев: 28

<< предыдущая заметка следующая заметка >>