Полезная информация

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.
 

Настраиваемые правила безопасности

Для чего нужны настраиваемые правила безопасности?

Настраиваемые правила безопасности позволяют пользователям устанавливать правила безопасности для браузера, а также иметь различные правила безопасности для различных ресурсов интернета. Идеи настраиваемых правил безопасности рождались в разных источниках. Разработчики из Bell Labs Vinod Anupam и Alain Mayer документировали и способствовали созданию кода для Mozilla. Печально известный bug 858 служит перечнем требований для такого рода функциональности. Такой код называется CAPS (capabilities, возможности). Наконец, зоны безопасности IE используют некоторым образом эту идею.

Этот документ предназначен программистам, знакомым с JavaScript.

N.B. Для Mozilla 0.9.9 строка “policynames” требуется для создания зонных правил (см. ниже).

Установка глобальных правил

Предположим, что Вам надоели всплывающие окна с рекламой и Вы хотите запретить всем веб-страницам открывать новые окна браузера. Вы можете сделать это добавив следующую строку в файл пользовательских настроек (user.js)1) Mozilla:

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

Установка параметра Window.open значением noAccess означает, что веб-страницам запрещён доступ к свойству open любого объекта, имеющего тип Window. Если веб-сайт попробует открыть новое окно с помощью window.open() (или open()), этот код не будет выполнен. Менеджер безопасности сгенерирует исключение JavaScript, которое не позволит выполнить функцию. Если веб-страница не перехватывает исключения, выполнение скрипта будет остановлено, а в консоли 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, ");

Настройка “capability.policy.strict.sites” определяет веб-сайты, для которых должно применяться правило strict. Значением этой настройки является список сайтов (представленных только протоколом и именем хоста), разделённых пробелами. Заключительные три строки определяют ограничительное (strict) правило. Для этих сайтов вышеуказанный пример запретит доступ к window.alert(), window.confirm() и window.prompt(). Обратите внимание: хотя мы и не указали, что для ограничиваемые сайты могут открывать новые окна с помощью window.open(), для них продолжает действовать правило по умолчанию. Предположим также, что мы обнаружили, что блокировка доступа к window.open() не позволяет нормально функционировать сайту www.usefulsite.net. В этом случае мы можем позволить этому ресурсу обойти ограничение window.open установив правило Window.open значением по умолчанию, sameOrigin:

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

Названием правила может быть любая строка; в этих примерах мы использовали строки strict и trustable, но с равным успехом могли бы их назвать blacklist или mypolicy или как-то ещё.

Уровни безопасности

Существуют три особых уровня безопасности:

  • noAccess: веб-сайты не имеют доступа к указанному свойству или функции.
  • sameOrigin (значение по умолчанию): веб-сайты имеют доступ к указанному свойству, но только для страниц с “родного” сайта. В этом документе объясняется, как Mozilla определяет “родственность” двух страниц.
  • allAccess: веб-сайт имеет доступ к указанному свойству, как для “родных” страниц, так и для страниц других сайтов.

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

Get и Set

Вы можете указать правила, применимые только при чтении значения свойства, или только при изменении его значения, добавляя .get или .set после имени свойства. Это позволит Вам указывать одно правило для чтения значения свойства и другое - для изменения его значения. Ниже приведены несколько примеров, запрещающих страницам изменять значения свойств, но не запрещающих чтение их значений. Установка Class.property.get и Class.property.set на один уровень безопасности эквивалентна установке Class.property на этот уровень. Не используйте get или set после имён функций (например open или write); идея “get” и “set” применима только к свойствам, не являющимся функциями (таким как bgColor или location).

Определение объектных имён

Определение правильного объектного имени иногда довольно сложно. Допустим, Вам необходимо запретить автоматическую отправку формы, но Вам неизвестно имя класса элемента формы. Простейшим выходом в данном случае будет написание скрипта, преобразующего объект в строку. Если, перейдя на страницу, Вы наберёте в адресной строке javascript:alert(document.forms[0]), Вы увидете элемент document.forms[0] в виде [xpconnect wrapped HTMLFormElement]. HTMLFormElement является именем класса, так что Вы можете установить уровень безопасности noAccess для HTMLFormElement.submit, чтобы запретить автоматическую отправку формы конструкцией form.submit. Некоторые элементы, такие как HTMLAnchorElement, имеют особые функции toString, затрудняющие поиск имён классов для этих элементов. Если Вы наберёте в адресной строке javascript:alert(document.links[0]), Вы увидите URL первой ссылки, вместо имени её класса. Чтобы обойти эту трудность, необходимо воспользоваться функцией по умолчанию toString объекта document.links[0], примерно так: javascript:alert(window.toString.apply(document.links[0])). Предупреждение: некоторые свойства имеют несколько путей доступа При блокировании доступа к свойству важно помнить, что к некоторым свойствам существует более чем один путь доступа. Предположим, пользователь хочет запретить доступ к атрибуту href ссылочных тегов (<A HREF=“…”>) скрипту ресурса www.evil.org. Следующих настроек будет недостаточно:

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

Хотя эти настройки не позволят скрипту ресурса www.evil.org получить доступ к document.links[1].href, скрипт сможет получить это значение с помощью синтаксиса DOM 2 document.links[1].attributes.getNamedItem(“href”) или document.links[1].getAttribute(“href”). Следующие настройки полностью блокируют доступ к атрибуту 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 :

  • Правило состоит из строки названий правил, строки сайтов, и одной или нескольких строк правил. Строка сайтов пропускается для правила default, но должна присутствовать для всех остальных.
  • Строка названий правил указывает названия всех правил, которые необходимо определить. Должна быть только одна строка названий правил, независимо от количичества определяемых правил. Эта строка имеет следующий формат:
    user_pref(“capability.policy.policynames”, “<список названий правил>”); где <список названий правил> является списком определяемых пользователем названий правил, разделённых запятой и/или пробелами.
  • Строка сайтов имеет следующий формат:
    user_pref(“capability.policy.<название правила>.sites”,“<список URL>”);
    • <название правила> - это любая комбинация букв и цифр, начинающаяся с цифры.
    • “<список URL> - это список URL, разделённых пробелами. Каждый URL списка должен быть представлен либо в виде protocol:, что указывает на применимость правила ко всем URL с указанной протокольной частью (например, http:), или в виде protocol://host что указывает на применимость правила к ресурсам указанного хоста (например, http://www.annoyingsite.myisp.com). Не указывайте пути в URL (символ / после имени хоста, и все прочие, следующие за ним).
  • Строки правил имеют следующий формат:
    user_pref(”capability.policy.<название правила>.<имя класса>.<имя свойства>“,”allAccess | noAccess | sameOrigin | <название возможности>“);
    • <название правила> должно совпадать с названием одного из правил в строке сайтов.
    • Значения настроек (allAccess, и т. п.) описаны выше.

Запрет выполнения Javascript для сайта

Специальное правило javascript.enabled может быть использовано для запрещения выполнения кода JavaScript как глобально, с помощью правила default, или для группы сайтов. Для этого специального правила значением должно быть ”noAccess“ или ”allAccess“. Другие значения не будут работать. Следующий пример запрещает выполнение JavaScript для ресурсов site1.com и site2.com:

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");

Следующий пример запрещает выполнение JavaScript на всех сайтах, за исключением goodsite.com:

user_pref("capability.policy.policynames", "jsok");
user_pref("capability.policy.default.javascript.enabled", "noAccess");
user_pref("capability.policy.jsok.sites", "http://goodsite.com");
user_pref("capability.policy.jsok.javascript.enabled", "allAccess");

Помните, что только значения ”allAccess“ или ”noAccess“ будут работать для правила javascript.enabled. Не используйте ”sameOrigin“ или какое-либо иное значение. Также, обратите внимание, что следующая настройка:

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");

Интерфейс пользователя

До сих пор не существует пользовательского интерфейса для настройки правил безопасности. Надеемся, в будущем появится панель настроек, которая позволит пользователями устанавливать правила без необходимости ”ручного" редактирования файла user.js или знания JavaScript. Это может стать труднейшей частью реализации (см. bug 38966).

1) Обратите внимание: настройки из user.js автоматически копируются в prefs.js
 
  suite/caps.txt · Последние изменения: 2006/05/01 19:55
 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2011 Mozilla Russia
Язык отображения форума: [Русский] [English]