На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Создание  СОЕДИНЕНИЯ с ДРУГИМ КОМПЬЮТЕРОМ

В связи с существованием возможности загрузки по сети исполняемых файлов основной проблемой для каждого администратора является тот факт, что такая программа может создать соединение с компьютером-источником или какой-либо другой машиной. Создание канала передачи данных особенно опасно в том случае, если программа может выполняться и без взаимодействия с пользовате­лем. Более того, пользователь может даже и не подозревать о том, что загружен­ная им программа выполняется. Чтобы лучше понять связанные с передачей исполняемых файлов проблемы, давайте посмотрим, что может сделать апплет Java. Например, пользователь может случайно загрузить апплет, у которого нет визуального компонента (другими словами, он ничего не отображает на экра­не). В этом случае пользователь даже и не узнает о том, что этот апплет был загружен на его машину. Попав на машину пользователя, апплет может полу­чить информацию о системе, сети, файлах с паролями и т. д. После этого он может переслать полученную информацию на хост, с которого он был загру­жен, и даже на хост, не участвовавший в соединении. В этом случае говорят, что апплет создал канал передачи данных.
Чтобы предотвратить подобные явления, модель безопасности Java не позволяет
апплетам создавать сетевые соединения ни с кем другим, кроме как с компьюте­ром, на котором расположены файлы класса. В качестве такого компьютера может выступать хост, содержащий HTML-страницу со ссылкой на программу Java, или хост, указанный в параметре codebase тега <АРРЬЕТ>. Если этот пара­метр указывает на некоторый хост, то этот хост будет выступать в качестве хоста
апплета. Соединение с таким компьютером также обладает рядом ограничений.
В частности, это соединение может существовать только до тех пор, пока акти­вен поток, управляющий выполнением программы. Например, некоторые ап-Java, обладающие доступом к базам данных сервера, могут передавать данные своему серверу. Благодаря этому они могут получать информацию из базы данных в диалоговом режиме.
Однако модель безопасности гарантирует, что локально выполняемый апплет может соединяться только с сервером-источником. Например, если апплет попытается создать соединение с сервером jamsa.com, который не является его источником, то эта попытка окончится неудачей. В результате подобной опе­рации будет сгенерировано исключение безопасности. Рассмотрим пример. До­пустим, что выполняющийся в броузере апплет загружен с Web-сервера, распо­ложенного по адресу http://www.gulfpub.com/. Пусть этот апплет содержит следу­ющую строку:
Socket S = new Socket("jamsa.com", 25, true);
В этом случае будет сгенерировано исключение безопасности. Для пользователя сообщение о нарушении безопасности говорит только о том, что апплет пытает­ся произвести какую-то некорректную операцию. показано, как Netscape Navigator отображает ошибку безопасности.
СОЗДАНИЕ СЕТЕВОГО СОЕДИНЕНИЯ с хостом-источником
Как уже говорилось, апплет может создать только одно сетевое соединение, а именно, со своим источником. Для этого программа Java должна указать такое же имя хоста, которое было у броузера во время загрузки апплета.
Например, вы загрузили HTML-страницу, воспользовавшись ее URL. Пусть это будет страница http://www.jamsa.com/JavaNow/appletPage.htmia которой рас­положена программа Java. Чтобы создать соединение с этой страницей, такая программа должна содержать следующую строку:
Socket s = new Socket("www.jamsa.com", 25,   true);
Апплет не может соединиться с хостом ни с помощью IP-адреса, ни с помощью сокращенного имени хоста (например, jamsa.com). Если ваш апплет должен со­здать соединение с хостом-источником, то можно смело использовать в качестве ссылки константу — так вам будет проще изменять программу. Отметим, однако, что в некоторых средах апплет не может создать соединение даже с хостом-ис­точником. Такое часто случается в сетях с брандмауэрами: брандмауэр может
запретить передачу данных из внутренней сети. РАБОТА с УСТОЙЧИВЫМИ АППЛЕТАМИ
При обсуждении программ специалисты зачастую упоминают устойчивые объек­ты (persistent-state object). Это объекты, которые постоянно хранятся в компью­тере. Другими словами, устойчивым является апплет, который операционная
система сохраняет на жестком диске или в сети. Например, сохраненный на жестком диске документ текстового процессора является устойчивым, или, как еще говорят, обладает устойчивостью. Когда вы сохраняете изменения в доку­менте, они будут отображены при следующем открытии документа. Устойчи­вым называется объект, который помнит, в каком месте вы остановились. При этом от вас не требуется производить открытие, сохранение и закрытие файлов. Всякий раз, когда вы получаете доступ к устойчивому объекту, тот попросту продолжает свою работу с того места, где вы остановились в прошлый раз.
Основным различием между устойчивыми объектами и программами является прозрачность хранения данных. Любой устойчивый объект обслуживает все опе­рации с файлами, происходящие в фоновом режиме, без участия пользователя. Но для этого подобные объекты требуют доступ к диску и расположенным на нем файлам. Именно поэтому они не могут удовлетворить критериям модели безопасности Java. Другими словами, устойчивые апплеты можно использовать многократно. Неустойчивыми называются апплеты, которые исчезают после удаления из памяти компьютера. Однако апплеты могут поддерживать устойчи­вое состояние и на стороне сервера. Более того, апплеты сервера могут созда­вать на нем устойчивые файлы и считывать их по мере необходимости. В насто­ящее время программный интерфейс апплетов JDK не содержит поддержки устойчивых апплетов.
Компания JavaSoft и другие группы разработчиков уже приступили к созданию устойчивых апплетов. Как уже говорилось, надежные апплеты обладают воз­можностями доступа, выходящими за рамки коробки. По определению, только надежный апплет может быть устойчивым. Эти апплеты поддерживают устойчи­вое на стороне клиента. Более того, многие из надежных апплетов обладают дополнительными правами доступа с расширенной безопасностью. Их можно пересылать только с цифровыми подписями. Надежные апплеты пока еще не получили широкой поддержки.
ПОРОЖДЕНИЕ ПРОГРАММ
Как уже говорилось в главе 1, вирус-червь, остановивший в 1988 году работу многих серверов, во время своей деятельности производил неограниченное ко­личество своих копий. Каждая новая копия представляла собой новую програм­му. Когда программа создает свою копию в многозадачной системе и указывает
компьютеру выполнять ее наравне с программой-оригиналом, то такой процесс
называется порождением.
Модель безопасности Java запрещает апплетам запускать программы на стороне клиента. Другими словами, ни один апплет не может запустить или породить процесс без вашего ведома. Это ограничение играет важную роль: благодаря ему апплеты не могут запускать программы, выходящие за пределы коробки. Ведь такие программы могут передать апплету важные данные о пользователе, а тот, в свою очередь, может переслать их хосту-источнику. Если бы не было короб­ки, то апплет мог бы выполнить команду и перенаправить выходные данные самому себе, а получив их, он смог бы передать информацию своему серверу-
источнику. Потом, апплет мог бы, основываясь на полученной информации,
скопировать некоторые файлы с машины пользователя на сервер-источник.
То, что апплет не может породить внешние файлы или каким-либо другим спо­собом управлять ими, является гарантией того, что он не сможет вызвать проце­дуры остановки системы (вроде System.exit i системах Unix или вызов процедуры SetSystemPowerstatewi программного интерфейса Windows). Кроме того, модель безопасности Java запрещает апплетам управлять потоками, находящимися вне группы потоков апплета. Группой потоков a time та называется множество пото­ков, создаваемых апплетом во время своей работы. Таким образом, ни один апплет не может получить доступ к программам, выполняющимся в памяти ком­пьютера.
ЭЛЕМЕНТАРНЫЕ СРЕДСТВА БЕЗОПАСНОСТИ
Существует несколько простейших методов защиты компьюте­ров от атак с использованием языка программирования Java:
1. Всегда используйте самую новую версию броузера. Некото­рые наиболее важные проблемы безопасности Java являются результатом ошибок, допущенных при создании виртуальной машины Java.
2. Пользуйтесь броузерами, которые позволяют отключить средства выпол­нения апплетов Java.
3. Чтобы отключить средства выполнения апплетов в Internet Explorer, откройте меню Вид и выберите в нем пункт Параметры. На экране по­явится диалоговое окно Параметры (10). Выберите заклад­ку Безопасность и удалите с помощью мыши флажок напротив пункта Программы Java.
4. После этого щелкните мышью по кнопке ОК. Теперь броузер не будет выполнять апплеты Java.
5. Чтобы отключить средства выполнения апплетов в Netscap Navigator, откройте меню Options и выберите в нем пункт Network Preferences. На экране появится диалоговое окно Preferences (11). Выбе-
. рите закладку Languages и удалите с помощью мыши флажок напротив пункта Enable Java.
6. После этого щелкните мышью по кнопке ОК. Теперь броузер не будет выполнять апплеты Java.
Чтобы полу­чить доступ к объектам, в Java используются дескрипторы, создаваемые вирту­альной машиной Java. На самом деле работа с дескрипторами очень напоминает работу с указателями. Однако вы не можете управлять дескрипторами теми же способами, что и при использовании указателей. Апплеты и приложения Java не могут изменять дескрипторы объектов. Например, в С\С++ программист может увеличить значение указателя на строку и тем самым переместить строку в памяти (вычисления с указателями). Если же вы попробуете изменить в Java зна­чение дескриптора, то виртуальная машина Java вернет ошибку безопасности.
В С\С++ указатели особенно часто применяются при работе с массивами или строками. Но в Java строки и массивы поддерживаются на более высоком уров­не, и поэтому программист не может использовать вычисления с указателями. Виртуальная машина Java проверяет границы всех массивов во время выполне­ния программы. Если вы попытаетесь воспользоваться отрицательным индексом или индексом, превышающим размер массива, то такая программа вызовет ис­ключение времени выполнения (run-time exception). Это ошибка, которая приво­дит к остановке работы всей программы. В нашем случае (выход за границу массива) будет сгенерирована ошибка безопасности. После создания объекта массива программа не может изменить его размер. Другими словами, в Java не разрешается производить динамическое выделение памяти.
Строки в Java представляют собой неизменные объекты. То есть переменная строчного типа может изменять свое значение, но не может изменять свою мак­симальную длину. Строкой называется несколько (или ни одного) символов, заключенных в двойные кавычки. Более того, виртуальная машина Java рас­сматривает каждую строку как экземпляр класса String. Использование строк
постоянной длины помогает избежать общих ошибок времени выполнения, ко­торые могут быть использованы хакерами. Однако в мире ничто не совершенно.
Строки постоянной длины занимают определенное (неизменное) пространство в памяти, а это может привести к переполнению системной памяти. Именно на этой особенности Java построен еще один тип атак отказа служб. Как вы узнаете далее, для проведения подобных атак хакеры могут воспользоваться еще некото­рыми особенностями Java.
Компилятор Java следит за тем, чтобы выполняемые в броузере программы ис­пользовали только правильные преобразования типов. Java — это язык со стро­гой типизацией, в отличие от С или C++. Строгая типизация подразумевает, что программа не может преобразовывать объекты к подтипу без проверки вре­мени выполнения. Другими словами, если программист использует перемен­ную типа автомобиль, то программа не может преобразовать эту переменную в переменную типа седан без того, чтобы виртуальная машина Java не проверила, является ли переменная типа седан подклассом автомобиль.
Более того, при инициализации переменной программист может указать про­грамме, что эта переменная не должна изменять своего значения во время вы­полнения. Для этого он должен воспользоваться модификатором final. Если программа попытается изменить значение переменной final, то компилятор не будет производить компиляцию программы. Кроме того, он выдаст программи­сту сообщение о попытке изменения.
Прежде чем будет возможно использование какого-либо метода объекта, компи­лятор должен проверить правильность типа метода. Метод — это присущая объекту функция. Например, у вас может быть объект автомобиль с методом запустить-Автомобиль, который срабатывает каждый раз, когда вы устанавливаете ключ в состояние включено. Когда ключ устанавливается в состояние выключено, выпол­няется метод остановитьАвтомобиль. Если же вы попытаетесь выполнить метод запуститьАвтомобиль для объекта, не принадлежащего к классу Автомобиль, то компилятор выдаст сообщение об ошибке компиляции. Приведем пример. Допус­тим, вы попытаетесь вызвать метод запуститьАвтомобиль для объекта велосипед:
велосипед.запуститьАвтомобиль()
В этом случае компилятор Java выдаст сообщение об ошибке компиляции.
Для определенных в классе методов и переменных в Java предусмотрены моди­фикаторы доступа. Они определяют, к каким областям класса или программы будет предоставлен доступ выбранному методу или переменной. Чтобы лучше понять концепцию модификаторов доступа, я приведу аналогию с персонажами книги. Если персонаж появился на первой странице книги, то вы будете по­мнить о нем на протяжении всего повествования. Но если характеристика пер­сонажа приводится только на 300-й странице, то читатель узнает о нем только после прочтения всех 300 страниц.
В Java строго отслеживаются права доступа, установленные с помощью моди­фикаторов доступа. Другими словами, автор не сможет рассказывать о герое книги до тех пор, пока не представит его описание. Например, программист может создать некие важные функции, объявив их частными методами. Если же нужно сделать так, чтобы функция была доступна и для других классов, то она объявляется публичным методом. И компилятор, и библиотека времени выполнения производят проверку того, чтобы в программе не было вызовов частных функций из других классов. Например, для класса Автомобиль функция запус­титьАвтомобиль является частной. Только человек с ключом зажигания, сидя­щий в автомобиле, может его запустить. Однако метод покраситьАвтомобиль может быть публичным. В таблице 13.3 приведены правила доступа к различным методам и переменным.
Тип
Значение
public protected
private
По умолчанию
Публичный метод может быть вызван из любого места программы, если разрешен доступ к имени класса.
Доступ к защищенному методу или полю может получить потомок класса. Например, в вызове class Parent {protectedint х; } class Child extends Parent { ... } класс Child может получить доступ к полю х только в объектах типа Child (или его подмножества). Однако этот класс не может получить доступ к полю х в объектах типа Parent.
Доступ к частному методу или переменной могут
получить только экземпляры класса, в котором определен этот метод или переменная.
вы при объявлении метода не указали модификатора доступа, то по умолчанию он будет _считаться частным методом._
Правила доступа в языке Java.
РАЗЛИЧИЯ, СВЯЗАННЫЕ с источником А
Как уже говорилось, система Java может загружать апплеты двумя различными способами. Каждый из этих способов определяет, какие действия сможет вы­полнять апплет. Если апплет загружен из Web, то он будет загружен загрузчи­ком класса. На такой апплет будут наложены ограничения модели коробки. С другой стороны апплет, на жестком диске клиента в каталоге,
указанном в пути классов клиента, будет загружаться в память загрузчиком опе­рационной системы. Далее приводятся наиболее важные различия между загруз­чиком класса и загрузчиком операционной системы:
• Апплеты, загруженные в память средствами операционной системы, мо­гут считывать и записывать файлы. Апплеты, загруженные с помощью загрузчика класса (т. е. загруженные с другой машины), не могут проде­лывать подобные операции.
• Апплеты, загруженные в память средствами операционной системы, мо­гут загружать чего нельзя сказать об апплетах, загруженных с помощью загрузчика класса. Последние обладают доступом только к стан­дартной библиотеке Java. Дело в том, что стандартная библиотека Java является частью виртуальной машины Java. В этой библиотеке хранятся определения основных классов Java, включая и класс Applet. При созда­нии любых апплетов ваши классы будут порождены от классов, опреде­ленных в стандартной библиотеке Java.
• Апплеты, загруженные в память средствами операционной системы, мо­гут выполнять другие программы и создавать свои копии. Апплеты, загру­женные с помощью загрузчика класса, не могут управлять потоками, не входящими в группу потоков апплета. Другими словами, удаленные ап­плеты не могут выполнять других программ или создавать свои копии.
• Апплеты, загруженные в память средствами операционной системы, мо­гут завершить работу виртуальной машины Java. Апплеты, загруженные
из сети, могут только приостановить выполнение своих потоков.
• Апплеты, загруженные в память средствами операционной системы, не подвергаются проверке верификатора. С другой стороны, верификатор про­веряет каждый апплет, загруженный из сети. Только после завершения такой проверки виртуальная машина Java позволит броузеру выполнить апплет.
Броузеры, поддерживающие Java, загружают апплеты, определенные посред­ством URL///^например, в корпоративных сетях), с помощью загрузчика класса. Поэтому на такие апплеты налагаются все ограничения системы безопасности загрузчика и диспетчера безопасности. Например, если вы укажете URL в виде flle://c:/javanow/public_html/sample.html и файл sample.html содержит какой-то ап­плет, то броузер загрузит его с помощью загрузчика класса. Это относится и к файлам, расположенным на вашей машине.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика