#17, 24–30 сентября 2003   |   ежедневные сборки Mozilla Firebird и Mozilla Thunderbird для linux

Новости

Накануне 1.5

На этой неделе должна выйти Mozilla 1.5, а вместе с ней — Mozilla Thunderbird 0.3 и Mozilla Firebird 0.7. А пока разработчики нас радуют самыми разными сборками "release candidate". Например, 26 сентября вышла Mozilla 1.5 RC 2, 28 сентября - Mozilla Firebird 0.7 RC и Mozilla Thunderbird 0.3 RC 2. Нам бы тоже хотелось проверить наши сборки, поэтому мы также предлагаем их вашему вниманию.

вверх

Новости от Sidebar.Ru

Новое в каталоге Sidebar.Ru:

вверх

Полезное

Сборка Composer из CVS

Теперь и Composer можно легко собрать из CVS, как сообщил его разработчик Daniel Glazman. Процедура ничем не отличается от обычной, нужно лишь использовать правильные файлы .mozconfig для linux/gcc3.2 и Windows/Mingw. Наши тестовые сборки лежат тут: ftp://ftp.altlinux.ru/pub/people/aen/composer/ , пока они без русского перевода. В Composer сейчас много недоделок, но, будем надеяться, что к выходу Mozilla 1.6 он обретет стабильность.

вверх

Изменения в процедуре сборки для Win32/Mingw

С понедельника 29 сенятбря для сборки всех продуктов Mozilla.org из CVS компилятором Mingw, о которой мы рассказывали ранее, требуется пакет binutils-2.14.90, который можно скачать с сайта Mingw. Для любителей самостоятельной сборки мы приводим работающие файлы .mozconfig для windows/mingw и linux: ftp://ftp.altlinux.ru/pub/people/aen/mozconfigs/29-09-03/. Примеры сборок - в ссылках к первой новости.

вверх

Обустраиваем Mozilla: уровни доверия сайтам

Оригинальный материал: Configurable Security Policies (CAPS).

Для практического применения этой статьи вам понадобится знание основ JavaScript.

В этот раз мы поговорим о чуть более важных вещах, чем раньше. Пользователи Internet Explorer, наверное, знают о том, что у них можно настраивать «зоны безопасности» (надеюсь, пользователи Interner Explorer действительно об этом знают). Однако не все знают, что сходная функциональность есть и у Mozilla. Разная политика безопасности для разных сайтов - очень удобно и очень полезно. Сотрудники Bell Labs Vinod Anupam и Alain Mayer спроектировали этот механизм для Mozilla и написали соответствующий код.

К сожалению, обычного интерфейса для использования этих настроек в Mozilla нет (см. ошибку 38966), поэтому мы будем работать с уже знакомым нам файлом user.js.

Если вас раздражают всплывающие окна с рекламой, вы можете добавить в user.js следующую строчку: user_pref("capability.policy.default.Window.open", "noAccess");. Здесь значение noAccess для Window.open говорит о том, что веб-страницы не могут получить доступ к свойству open объектов типа Window, поэтому попытки сделать это с помощью вызовов Window.open() или open() будут безуспешны. Механизм защиты создаст исключение JavaScript, предотвращая вызов функции, и если сайт не отслеживает исключения, работа сценария будет остановлена. Об исключении появится запись в консоли JavaScript.

Итак, мы рассматривали область сайтов default. В эту область сайтов попадают все сайты. Но кроме этого, вы можете создавать другие области сайтов со своими собственными настройками. Например, вы хотите запретить сайтам www.evil.org и www.annoying.com запретить открытие диалоговых окон:

user_pref("capability.policy.policynames", "strict");
user_pref("capability.policy.strict.sites", "http://www.evil.org http://www.annoying.com");
user_pref("capability.policy.strict.Window.alert", "noAccess");
user_pref("capability.policy.strict.Window.confirm", "noAccess");
user_pref("capability.policy.strict.Window.prompt", "noAccess");

В первой строке мы объявили новую область сайтов: strict. Во второй мы указали, какие сайты туда входят. Если вы хотите определить несколько областей, перечислите их через пробел:

user_pref("capability.policy.policynames", "strict, shoppingsites, ");

При перечислении сайтов в области необходимо указывать только протокол и имя узла, разделять элементы нужно пробелами. Заметьте, мы не переопределили значение Window.open, поэтому будут использоваться настройки для области default. Теперь предположим, что на некотором сайте мы теряем нужную нам функциональность, запретив открытие всплывающих окон, тогда мы создадим для этого сайта свою область и вернём свойству Window.open значение по умолчанию:

user_pref("capability.policy.policynames", "trustable");
user_pref("capability.policy.trustable.sites", "http://www.usefulsite.net");
user_pref("capability.policy.trustable.Window.open", "sameOrigin");

Итак, мы уже знаем, что есть два допустимых уровня защиты при использовании свойств и методов: noAccess и sameOrigin. Однако всего их три:

Если указанное значение не совпадает ни с одним из перечисленных выше, то оно является привилегированным именем и доступно сценарию, только если он подписан и пользователь дал своё одобрение.

Вы можете также запретить сценариям записывать некоторые свойства, но разрешить считывать их, или наоборот. Для этого добавьте после имени свойства .get или .set. Если Class.property.get и Class.property.set имеют одинаковые значения, то это же значение имеет и Class.property. Не пользуйтесь этим способом для свойств, которые одновременно являются и функциями (open или write, например, а вот с bgColor или location эти параметры применять можно).

Иногда определить нужный объект бывает сложно. Например, вы хотите, чтобы форма на сайте не могла принять от вас данные, но не знаете имя класса для элемента формы. Тогда можно просто написать в строке адреса javascript:alert(document.forms[0]), вы увидите, что document.forms[0] - это [xpconnect wrapped HTMLFormElement]. HTMLFormElement - имя класса, тогда мы можем указать свойству HTMLFormElement.submit значение noAccess, а form.submit не сработает. У некоторых элементов, например, HTMLAnchorElement, есть особая функция toString, усложняющая поиск имени класса. Например, если вы попробуете описанный выше трюк, вместо имени класса вы получите URL. Поэтому можно использовать функцию toString по умолчанию: javascript:alert(window.toString.apply(document.links[0])).

Ещё одна сложность: некоторые свойства можно использовать разными способами. Например, представьте, что мы запретили некоторому сайту пользоваться атрибутом href:

user_pref("capability.policy.policynames", "nohrefs");
user_pref("capability.policy.nohrefs.sites", "http://www.evil.org");
user_pref("capability.policy.nohrefs.HTMLAnchorElement.href", "noAccess");

Но этого недостаточно, потому что сценарий может использовать синтаксис DOM2: document.links[1].attributes.getNamedItem("href") или document.links[1].getAttribute("href"). Поэтому правильным будет следующее решение:

user_pref("capability.policy.policynames", "nohrefs");
user_pref("capability.policy.nohrefs.sites", "http://www.evil.org");
user_pref("capability.policy.nohrefs.HTMLAnchorElement.href", "noAccess");
user_pref("capability.policy.nohrefs.HTMLAnchorElement.attributes", "noAccess");
user_pref("capability.policy.nohrefs.HTMLAnchorElement.getAttribute", "noAccess");
user_pref("capability.policy.nohrefs.HTMLAnchorElement.getAttributeNS", "noAccess");

То есть обычно при блокировании атрибута стоит также блокировать свойство attributes и методы getAttribute и getAttributeNS.

Теперь предположим, мы хотим отключить использование JavaScript на сайте вообще, тогда нужно воспользоваться свойством javascript.enabled. Его значением могут быть только noAccess или allAccess. Пример:

user_pref("capability.policy.policynames", "nojs");
user_pref("capability.policy.nojs.sites", "http://site1.com http://site2.com");
user_pref("capability.policy.nojs.javascript.enabled", "noAccess");

При этом не забывайте, что настройка user_pref("javascript.enabled", false); перекрывает все значения свойств capability.policy, включая capability.policy.default.javascript.enabled, для всех сайтов.

Теперь примеры. Запретим сайтам изменять размер окна браузера:

user_pref("capability.policy.default.Window.innerWidth.set", "noAccess");
user_pref("capability.policy.default.Window.innerHeight.set", "noAccess");
user_pref("capability.policy.default.Window.outerWidth.set", "noAccess");
user_pref("capability.policy.default.Window.outerHeight.set", "noAccess");
user_pref("capability.policy.default.Window.sizeToContent", "noAccess");
user_pref("capability.policy.default.Window.resizeTo", "noAccess");
user_pref("capability.policy.default.Window.resizeBy", "noAccess");

Запретим сайтам перемещать окна браузера:

user_pref("capability.policy.default.Window.screenX.set", "noAccess");
user_pref("capability.policy.default.Window.screenY.set", "noAccess");
user_pref("capability.policy.default.Window.moveTo", "noAccess");
user_pref("capability.policy.default.Window.moveBy", "noAccess");

Запретим сайтам определять разрешение экрана и цветовые параметры:

user_pref("capability.policy.default.Screen.top", "noAccess");
user_pref("capability.policy.default.Screen.left", "noAccess");
user_pref("capability.policy.default.Screen.width", "noAccess");
user_pref("capability.policy.default.Screen.height", "noAccess");
user_pref("capability.policy.default.Screen.pixelDepth", "noAccess");
user_pref("capability.policy.default.Screen.colorDepth", "noAccess");
user_pref("capability.policy.default.Screen.availWidth", "noAccess");
user_pref("capability.policy.default.Screen.availHeight", "noAccess");
user_pref("capability.policy.default.Screen.availLeft", "noAccess");
user_pref("capability.policy.default.Screen.availTop", "noAccess");

Запретим сайтам менять текст в строке состояния:

user_pref("capability.policy.default.Window.status", "noAccess");

вверх