Xpoint
   [напомнить пароль]

Как (безопасно) выполнить код в контексте основного окна (content)?

Метки: [без меток]
2007-01-22 05:45:18 [обр] Mihail[досье]

Пишу html код с привилегиями UniversalBrowserWrite для сайдбара. Для облегчения своей работы. Например, заполнить все поля формы и отправить ее, открыть много ссылок в новых окнах. (Да, есть для этого расширения, но я слышал про проблемы с безопасностью, и не хочется натыкаться, да и свой код намного гибче чем готовое расширение). При этом в основном окне может быть совершенно любая страница. Поэтому возникают вопросы о безопасности.

Например, даже такой простой код в сайдбаре как alert(content.document.location.href) насколько я знаю, будет выполняться с контексте сайдбара, а не основного документа. И вдруг на location.href повешен getter, и в результате с привилегиями выполнится какой-то неизвестный мне код?

Поэтому хочется запускать скрипты в контексте основного окна.

Конкретно я хочу:

  1. читать-устанавливать значения типа content.document.forms[0].elements['text'].value
  1. сабмитить формы — content.document.forms[0].submit()
  1. идти по ссылкам — content.document.location.href="..."

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

Вместо ответа можно кинуть
А) ссылку на расширение, которое делает все это дейтсвительно безопасно
Б) ссылку на статью по этой теме (годится на английском)
В) или хотя бы ключевые слова и где искать — mozillazine? developer.mozilla.org?
(Пока что нашел XPCNativeWrapper)

спустя 6 минут [обр] Mihail[досье]
Для обеспечни безопасности — что удобнее — запускать приложение из chrome://... или запросить привилегии из обычной страницы http://... внутри сайдбара?
спустя 2 часа 22 минуты [обр] Владимир Палант(434/4445)[досье]

Читайте http://developer.mozilla.org/en/docs/XPCNativeWrapper

Вызов alert(content.document.location.href) в Gecko 1.8 и выше абсолютно безопасен. Вы получаете одну версию оболочки объекта Location, а скрипты страницы — другую. Соответственно никакой getter, который там висит, вас не касается, его видит только сама страница. А у вас объект в его "первозданном" виде.

Единственное, за чем надо следить — это чтобы xpcnativewrappers были включены. В Firefox они включены по умолчанию, а вот в SeaMonkey нужно этот ключ специально указать в contents.rdf.

спустя 10 часов [обр] Mihail[досье]
Я так понял, что если мой код находится в хроме, тогда alert(content.document.location.href) безопасен. А если он находится в http://... странице с привилегиями, тогда все же требуется XPCNativeWrapper ? Или нет?
спустя 19 минут [обр] Владимир Палант(434/4445)[досье]

XPCNativeWrapper защищает исключительно chrome://, причем происходит это обычно автоматически. Если у вас страница с http:// с привилегиями, то такой защиты для нее не будет. Единственное, что вы можете сделать — пользоваться методом Components.utils.lookupMethod() (Components.lookupMethod() в старых версиях Gecko). С его помощью можно безопасно получить "настоящий" метод объекта, или, для свойств, настоящий getter/setter свойства. Старые версии Adblock Plus использовали этот подход, чтобы работать безопасно в Gecko 1.7, в котором не было XPCNativeWrapper. Код здесь: http://www.mozdev.org/source/b......tent/Attic/security.js?rev=1.2

Пример использования:

if (secureGet(wnd, "location", "href") == "about:blank")
  secureSet(wnd, "location", "href", "http://google.com/");
secureLookup(wnd, "document", "addEventListener")("click", onClick, false);

Приличное извращение, но работает.

спустя 1 день 6 часов [обр] Mihail[досье]
А как мозиловская команда вопринимает Components.utils.lookupMethod() ? Будет о нем заботится, или сделает скоро deprecated ?
спустя 1 час 23 минуты [обр] Владимир Палант(434/4445)[досье]
Почему deprecated? Это полезный метод.
Powered by POEM™ Engine Copyright © 2002-2005