Wiki-учебник по веб-технологиям: JavaScript/ПроверкаИсточникаDocumentdomain ...

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

Идентифицирование маркированных скриптов


Вы можете маркировать инлайн-скрипты, скрипты обработчиков событий, JavaScript-файлы и объекты/entities JavaScript. Вы не можете маркировать URL'ы javascript. Вы обязаны идентифицировать то, что вы маркируете внутри HTML-файла:


Атрибут ARCHIVE


Все маркированные скрипты (инлайн-скрипт, обработчик события, файл JavaScript или объект JavaScript) требуют наличия в тэге SCRIPT атрибута ARCHIVE, значением которого является имя JAR-файла, содержащего цифровую подпись. Например, чтобы маркировать JavaScript-файл, вы можете использовать такой тэг:

<SCRIPT ARCHIVE="myArchive.jar" SRC="myJavaScript.js"> </SCRIPT>


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

<SCRIPT ARCHIVE="myArchive.jar" ID="a">
...
</SCRIPT>
<FORM>
<INPUT TYPE="button" VALUE="OK" 
   onClick="alert('A signed script')" ID="b"> 
</FORM>


Если вы специфицируете не более одного JAR-файла, вам нужно специфицировать файл только однократно. Включите атрибут ARCHIVE в первый скрипт на HTML-странице, и остальные скрипты на странице используют этот же файл. Например:

<SCRIPT ARCHIVE="myArchive.jar" ID="a"> 
document.write("This script is signed."); 
</SCRIPT>
<SCRIPT ID="b"> 
document.write("This script is signed too.");
</SCRIPT>


Атрибут ID


Все маркированные скрипты (инлайн-скрипт, обработчик события, файл JavaScript или объект JavaScript) требуют наличия в тэге SCRIPT атрибута ARCHIVE, значением которого является имя JAR-файла, содержащего цифровую подпись. Например, чтобы маркировать JavaScript-файл, вы можете использовать такой тэг:

<SCRIPT ARCHIVE="myArchive.jar" SRC="myJavaScript.js"> </SCRIPT>


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

<SCRIPT ARCHIVE="myArchive.jar" ID="a">
...
</SCRIPT>
<FORM>
<INPUT TYPE="button" VALUE="OK" 
   onClick="alert('A signed script')" ID="b"> 
</FORM>


Если вы специфицируете не более одного JAR-файла, вам нужно специфицировать файл только однократно. Включите атрибут ARCHIVE в первый скрипт на HTML-странице, и остальные скрипты на странице используют этот же файл. Например:

<SCRIPT ARCHIVE="myArchive.jar" ID="a"> 
document.write("This script is signed."); 
</SCRIPT>
<SCRIPT ID="b"> 
document.write("This script is signed too.");
</SCRIPT>


Использование расширенных привилегий


Как и маркированные объекты Java, маркированные скрипты используют вызовы Netscape-классов безопасности Java для запрашивания расширенных привилегий. Java-классы расширяются в Java Capabilities API.

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

netscape.security.PrivilegeManager.enablePrivilege("UniversalSendMail")


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

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

Следующий пример демонстрирует это, печатая такой текст:

7: disabled
5: disabled
2: disabled
3: enabled
1: enabled
4: enabled
6: disabled
8: disabled


Функция g запрашивает расширенные привилегии, и только команды и функции, которые вызываются после запроса и внутри функции g, получают привилегии.

<SCRIPT ARCHIVE="ckHistory.jar" ID="a">
function printEnabled(i) {
   if (history[0] == "") {
      document.write(i + ": disabled<BR>");
   } else {
      document.write(i + ": enabled<BR>"); 
   }
}
function f() {
   printEnabled(1); 
}
function g() {
   printEnabled(2);
   netscape.security.PrivilegeManager.enablePrivilege(
      "UniversalBrowserRead");
   printEnabled(3);
   f();
   printEnabled(4); 
}
function h() {
   printEnabled(5);
   g(); 
   printEnabled(6); 
}
printEnabled(7); 
h(); 
printEnabled(8);
</SCRIPT>


Цели/Targets


Типы информации, которую вы можете получить, называются targets. Они перечислены в таблице.
Target/Цель
Описание
UniversalBrowserReadПозволяет читать привилегированные данные из браузера. Это даёт возможность скрипту передавать одну проверку источника всему документу
UniversalBrowserWriteПозволяет модифицировать привилегированные данные в браузере. Это даёт возможность скрипту передавать одну проверку источника всему документу
UniversalBrowserAccessПозволяет читать и модифицировать привилегированные данные из браузера. Это даёт возможность скрипту передавать одну проверку источника всему документу
UniversalFileReadДаёт скрипту возможность читать любой файл на жёстком диске или другом носителе, подключённом к компьютеру
UniversalPreferencesReadДаёт скрипту возможность читать настройки, используя метод navigator.preference
UniversalPreferencesWriteДаёт скрипту возможность устанавливать настройки, используя метод navigator.preference
UniversalSendMailДаёт программе возможность отправлять посту на имя пользователя

Возможности JavaScript, требующие наличия привилегий


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


enableExternalCaptureДля захвата событий на страницах, загруженных с других серверов. Затем используйте captureEvents
closeБезусловное закрытие окна браузера
moveByПеремещение окна за пределы экрана
moveToПеремещение окна за пределы экрана
open

  • Для создания окна размером меньше 100 x 100 пикселов или больше, чем экран может вместить, с использованием innerWidth, innerHeight, outerWidth и outerHeight
  • Для перемещения окна за пределы экрана с использованием screenX и screenY
  • Для создания окна без строки заголовка с использованием titlebar
  • При использования alwaysRaised, alwaysLowered или z-lock для любых установок
resizeToДля изменения размеров окна на меньшие, чем 100 x 100 пикселов, или на большие, чем экран может вместить
resizeByДля изменения размеров окна на меньшие, чем 100 x 100 пикселов, или на большие, чем экран может вместить

innerWidthПри установке внутренней ширины окна в размеры менее 100 x 100 или более, чем экран может вместить
innerHeightПри установке внутренней ширины окна в размеры менее 100 x 100 или более, чем экран может вместить

Пример


В этом скрипте имеется кнопка, которая, когда её нажимают, выводит диалоговое окно alert, содержащее часть истории URL браузера. Для правильной работы этот скрипт обязан быть маркированным.

<SCRIPT ARCHIVE="myArchive.jar" ID="a">
function getHistory(i) {
   //попытка доступа к привилегированной информации
   return history[i]; 
}
function getImmediateHistory() {
   //запрос привилегии
   netscape.security.PrivilegeManager.enablePrivilege(
      "UniversalBrowserRead"); 
   return getHistory(1); 
}
</SCRIPT> 
...
<INPUT TYPE="button" onClick="alert(getImmediateHistory());" ID="b">