Для чего нужны чисто виртуальные функции. Виртуальная функция. Ну вот, а теперь к делу

На iOS - iPhone, iPod touch 23.03.2019

Поставщик услуг Интернета (ISP) с помощью мастера настройки Windows® Internet Explorer® 8 может создать пользовательский пакет, автоматизирующий регистрацию клиентов в Интернете.

При использовании одного из серверных методов регистрации в Интернете, которые поддерживаются пакетом администрирования Internet Explorer 8 (IEAK 8), сбор информации от пользователей проводится с помощью Интернет-сервера регистрации. Сервер регистрации добавляет информацию в базу данных клиентов, а затем отправляет обратно на компьютер пользователя пакет конфигурации. Этот пакет настраивает обозреватель для последующих подключений к Интернет-службам.

В IEAK 8 возможны следующие серверные методы регистрации:

  • Internet Explorer в режиме полного экрана . Созданные окна регистрации могут отображаться в Internet Explorer в режиме полного экрана.
  • Мастер подключения к Интернету . Этот мастер может быть задан как инструмент, с помощью которого новые клиенты регистрируются и настраивают свои компьютеры для пользования Интернет-службами. Это также позволяет производить изменения настроек пользователей, уже имеющих учетные записи Интернета.

Вне зависимости от выбранного серверного метода необходимо начать с выполнения следующих задач, описанных в этом разделе:

  • Регистрация в Интернете в режиме полного экрана

Подготовка файлов и папок регистрации

Для правильной установки папка, содержащая настраиваемые файлы регистрации, должна иметь следующие файлы:

  • Signup.htm . Эта HTML-страница предоставляет информацию об Интернет-службах и должна содержать ссылку на соответствующую страницу сервера регистрации. Файл примера Signup.htm, находящийся в этих папках (в зависимости от используемого метода регистрации), можно заменить. <системный_диск >:\Program Files\Windows IEAK 8\toolkit\isp\Server\ICW или <системный_диск >:\Program Files\Windows IEAK 8\toolkit\isp\Server\kiosk. Например, можно добавить информацию о технической поддержке или включить ссылки на ISP-файлы Интернет-регистрации.
  • Signup.isp . Этот файл Интернет-регистрации используется для дозвона до сервера регистрации и упоминается в файле Signup.htm. Этот файл также содержит ссылку на URL-адрес сценария сервера, создающего файлы параметров Интернет (.ins). Параметры, содержащиеся в этом файле регистрации, можно редактировать при помощи мастера настройки Internet Explorer 8. Этот мастер также создает другие ISP-файлы для процесса регистрации. Примеры ISP-файлов также находятся в следующих папках (в зависимости от используемого метода регистрации): <системный_диск >:\Program Files\Windows IEAK 8\toolkit\isp\Server\ICW или <системный_диск >:\Program Files\Windows IEAK 8\toolkit\isp\Server\kiosk.
  • Остальные файлы регистрации . Все связанные файлы, в том числе и графические файлы с расширениями.gif и.jpg, должны быть сохранены в той же папке, что и файлы регистрации. Например, можно включить свои собственные версии файла Install.gif.

    Конфигурация DHCP для IIS

    При использовании сервера под управлением Internet Information Services (IIS) в качестве сервера регистрации необходимо настроить интернет-сервер регистрации на предоставление IP-адреса DHCP-сервера клиентскому компьютеру при подключении к серверу. Так как процесс регистрации относительно недолгий, время истечения срока аренды IP-адреса может быть небольшим - до нескольких минут.

    Так как процесс регистрации обычно совершается через удаленное подключение «точка-точка», отведенные для DHCP-сервера адреса не обязательно должны быть формально присвоенными. Необходимо определить, являются ли DHCP IP-адреса действительными или произвольными.

    Дополнительную информацию можно найти в документации по DHCP.

    Регистрация типа MIME файла.ins

    Для автоматической обработки файлов.ins на компьютере пользователя необходимо через сервер регистрации зарегистрировать тип MIME этого файла. Этот тип MIME обозначается как application/x-Internet-signup . Когда клиент запрашивает INS-файл, сервер регистрации отвечает этим типом MIME, который запускает связанную программу установки на клиентском компьютере.

    Типы MIME должны быть введены в реестр вручную. Для добавления INS-файла в качестве MIME-типа добавьте следующую информацию при помощи Regedit.exe.

    В этом ключе:

    HKEY_LOCAL_MACHINE\system32\CurrentControlSet\Services\InetInfo\Parameters\MimeMap

    Добавьте это значение:

    application/x-internet-signup,ins,5

    Это значение не имеет связанной строки. Дополнительную информацию об использовании типов MIME см. во встроенной документации IIS (

С целью обеспечения интеграции создаваемых в рамках проектов РФФИ региональных научных сетей и сетей крупных научных центров в глобальную сетевую инфраструктуру Интернет, а также с целью снижения затрат этих проектов на обеспечение межрегионального и международного трафиков в 1995 г. были организованы точка доступа и узел маршрутизации, а также введен в эксплуатацию международный наземный цифровой канал (64 Кбит/с).

Доступ региональных научных сетей к международному каналу связи и их обмен трафиком с основными российскими сетями обеспечивается узлом маршрутизации. Схема типового узла маршрутизации РФФИ приведена на рис.18.10 .


Рис. 18.10.

Наряду с указанными на схеме региональными сетями к центру маршрутизации подключены 25 московских организаций, в том числе Российская государственная библиотека (РГБ) и Государственная публичная научно-техническая библиотека (ГПНТБ).

В состав центра маршрутизации входит оборудование РФФИ, а также оборудование, предоставленное ИОХ РАН, ВорГТУ, ЯрГУ и ЧГТУ и приобретенное в рамках выполняемых в этих организациях проектов.

Узел маршрутизации РФФИ имеет прямые соединения (10 Мбит/с) с российским центром обмена сетевым трафиком М9-IX и с ЮМОС, через которые осуществляется обмен трафиком с более чем 20 российскими научными и общественными сетями.

В 1996-97 гг. центр маршрутизации и международный канал РФФИ использовались 17-ю региональными сетями в Москве, Владикавказе, Вологде, Воронеже, Королеве, Новгороде, Нижнем Новгороде, Ростове-на-Дону, Пензе, Перми, Челябинске, Казани, Кемерово, Уфе, Твери, Черноголовке, Ярославле.

MSK-IX (Московский центр взаимодействия компьютерных сетей Internet eXchange)

Автономная некоммерческая организация "Центр взаимодействия компьютерных сетей "MCK-IX" (российская точка обмена интернет-трафиком) учреждена Российским научно-исследовательским институтом развития общественных сетей (РосНИИРОС) в 2001 году с целью развития проекта "Московский Internet Exchange".

MSK -IX организован в 1995 г. Начавшись с единственного узла, организованного на Московской международной телефонной станции ММТС-9, сегодня московский Internet Exchange представляет собой надежную, распределенную систему, которая включает десять равноправных точек, объединенных высокоскоростной магистралью. Благодаря распределенной структуре MSK -IX существенно расширяются возможности для московских и региональных провайдеров по подключению к системе обмена IP -трафиком, а также по получению высокоскоростного транзита между узлами MSK -IX .

Через М9 подключено более 80% Рунета. Через ММТС № 9 также проходит большинство телекоммуникационных каналов, соединяющих Россию с миром.

Сеть MSK -IX имеет 10 узлов доступа, объединенных высокоскоростной магистралью, что позволяет обеспечить высокое качество и доступность услуг MSK -IX в точках концентрации телекоммуникационых ресурсов, включая М9, М10, KIAEHOUSE и ряд других технологических площадок в Москве.

MSK -IX является одним из крупнейших европейских Internet Exchange по числу подключенных операторов и входит в ассоциацию международных сетей обмена трафиком - European Internet Exchange Association (Euro-IX) .

Проект MSK -IX начинался в конце 1994 года, когда московские интернет-провайдеры Демос, Релком, МГУ, НИИЯФ МГУ, FREEnet, Ассоциация RELARN, Роспринт пришли к соглашению о создании точки вза-имного обмена IP -трафиком. Это соглашение было вызвано желанием провайдеров обмениваться своим трафиком друг с другом напрямую, оптимизируя маршруты прохождения трафика, что существенно сокращало как время передачи сетевых пакетов данных, так и загрузку дорогостоящих международных каналов связи.

Изначально точкой обмена трафика была избрана международная телефонная станция ММТС-9, или М9, в которой все интернет-провайдеры имели точки присутствия, т. к. на М9 приходили все международные и междугородные каналы связи. Координация MSK -IX была поручена Российскому НИИ развития общественных сетей (РосНИИРОС).

В 2002 году была произведена модернизация MSK -IX. Московский Internet Exchange стал распределенным, включив в себя 10 точек, соединенных волоконно-оптическим кабелем по технологии Gigabit Ethernet :

  • ОАО "Центральный телеграф";
  • Институт космических исследований РАН;
  • РНЦ "Курчатовский Институт";
  • Cable & Wireless CIS Svyaz Ltd.;
  • Центральная станция связи РЖД;
  • ГП "Космическая связь";
  • ММТС 9 и ММТС 10;
  • Предприятия Sonera Rus и WideXs .

В декабре 2004 года российский универсальный оператор связи "Корбина Телеком" приступил к реализации в Москве проекта "Интернет 2", одной из отличительных особенностей которого является применение протокола передачи данных IPv6 .

Сервисы Internet

Способы использования Интернета определяются предоставляемыми посетителям сервисами, в число которых входят традиционные, специальные и новые виды сервиса.

К традиционным видам сервиса относятся:

  • электронная почта (e-mail );
  • телеконференции (news );
  • живое общение ( chat );
  • использование вычислительных и информационных ресурсов компьютера в режиме удаленного терминала (telnet );
  • служба хранения, поиска и пересылки файлов - FTP ( File Transfer Protocol ) ;
  • WWW (World Wide Web) - всемирная паутина (в ее составе в июле 1993г. было 130 хост-компьютеров, а в июне 1996г. 230000).

К специальным сервисным средствам относятся:

  • информационная система Gopher ;
  • информационная система WAIS , ведущая поиск по ключевым словам,
  • поисковые системы WWW ;
  • библиографические (диспетчерские) системы;
  • Archie - поисковая система FTP ;
  • и др.

Новые виды сервиса включают в себя:

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

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

Обучение пользованию Интернетом в основном сводится к общему ознакомлению с устройством Интернета, с предоставляемыми сервисами, адресацией ресурсов, с поиском информации в сервисе WWW и основами работы с электронной почтой.

Провайдеры Интернета по составу предоставляемых услуг делятся на три группы:

  • провайдеры, предоставляющие доступ в Интернет - ISP (Internet Service Providers) . Примером могут служить http://www.rol.ru , http://www.mtu.ru , и др.;
  • провайдеры, предоставляющие услуги присутствия в Интернет - IPP (Internet Presence Providers) , примером которых могут служить http://www.mail.ru , http://www.narod.ru , и др. К предоставляемым ими услугам относятся электронный почтовый ящик и услуги почты, размещение сайта клиента на ЭВМ провайдера, различные поисковые системы, новости, и т.д.;
  • издатели собственных материалов - PCP (Private Content Publisher) , которые содержат (т.е. разрабатывают и эксплуатируют) свои информационные системы (например, http://www.garant.ru , http://www.rbc.ru и т.п.), электронные магазины, рекламные агентства, туристические фирмы, и т.д.

ISP (Internet Service Provider)

ISP - это поставщик услуг Internet , т.е. организации или частные лица, предоставляющие доступ в Internet (hosting ) . Источником доходов ISP являются владельцы локальных ЭВМ, которым предоставляется доступ к данной глобальной вычислительной сети. Через имеющиеся шлюзы локальные пользователи могут получить доступ к другим глобальным сетям и таким образом получить возможность работать в Internet .

ISP подключены к Internet постоянно и имеют постоянный IP -адрес (IP -адрес является частью URL ). Остальные пользователи (клиенты) могут подключаться к ISP лишь на время работы. IP -адрес присваивается им ISP каждый раз при подключении, а при отключении - отбирается и может быть отдан кому-нибудь другому. ISP часто предоставляет своим клиентам удаленный доступ по коммутируемым каналам телефонной связи (это называется "dual-up service "). Для этого ISP арендует у местной телефонной компании телефонные номера, по которым с ним можно связаться.

ISP иногда может предоставлять (делегировать) функции хостинга локальным ЭВМ (которые при этом получают свой постоянный IP -адрес), например, стоящим дома или на работе, и превращать таким образом локальную ЭВМ в ISP более низкого уровня. В свою очередь, локальная хост -ЭВМ может делегировать такие права другой локальной ЭВМ, которая становится хост-провайдером (т.е. ISP ) еще более низкого уровня (если она, конечно, имеет доступ к каналам связи - например, через учрежденческую АТС). Образуется цепочка провайдеров, различающихся своими IP -адресами: mesi .ru; ex. mesi .ru; stud.ex. mesi .ru и т.д.

Широко известными интернет-сервис-провайдерами являются, например, mtu .ru и rol.ru .

IPP (Internet Presence Provider)

IPP - это провайдер, обеспечивающий своим клиентам присутствие в Internet . Он так же подключен к Internet постоянно и имеет постоянный IP -адрес. В отличие от ISP , он не предоставляет услуг типа dual-up service . Он может только размещать на своих серверах публикации других лиц, рекламу, веб-сайты, организовывать работу электронной почты и т.д.

IPP после регистрации на их сайте предоставляют имя, которое будет являться наименованием вашего почтового ящика (e-mail ), и кроме того - именем вашего сайта, который размещается на ЭВМ провайдера.

Например, после регистрации на mail.ru предоставляется почтовый ящик имя@mail.ru . Адрес вашего сайта будет: http://www.mail.ru/~имя .

Такое имя сайта не удовлетворяет многих пользователей. У провайдера http://www.narod.ru имя сайта выглядит по-другому: http://www.имя.narod.ru . Получается, что ваш сайт имеет имя в домене III уровня, а не где-то среди каталогов IPP . Это выглядит солиднее, похоже на то, что у вас есть свой компьютер с постоянным IP -адресом.

Широко известными провайдерами присутствия в Интернете являются:

  • http://www.mail.ru ;
  • http://www.yandex.ru ;
  • http://www.narod.ru ;
  • http://www.rambler.ru и др.

PCP (Private Content Publisher)

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

Этот тип провайдера очень бережно относится к своей информации, к исправности своего компьютера, и у него всегда можно получить самые достоверные, постоянно обновляемые данные по выбранной им специальности.

Пример этого типа провайдера - http://www.garant.ru (юридические документы).

В отличие от ISP , он не предоставляет услуг dual-up service . Подготовка провайдеров Интернета предусматривает изучение таких дисциплин, как:

  • общий курс по работе в сети Интернет;
  • техническое обеспечение глобальных вычислительных сетей;
  • программирование на специальных алгоритмических языках ;
  • операционные системы для глобальных вычислительных сетей;
  • программное обеспечение глобальных вычислительных сетей;
  • интернет-протоколы;
  • инструментальные средства для исследования глобальных вычислительных сетей;
  • WWW -программирование на стороне клиента;
  • WWW -программирование на стороне сервера;
  • разработка веб-сайтов;
  • веб-дизайн;
  • администрирование узлов глобальных вычислительных сетей.

Характеристики хостинг-провайдеров

Размещение сайтов на чужой технической базе называется хостингом . Хостинг бывает платный и бесплатный.

При платном хостинге оговаривается состав услуг, предоставляемых провайдером:

  • провайдер предоставляет все: канал, ЭВМ, URL -адрес, обслуживание сайта и т.д.;
  • провайдер предоставляет площадь для размещения вашей ЭВМ, канал, URL , обслуживание, и т.д.;
  • и т.д.

При бесплатном хостинге провайдер предоставляет URL , место на своих магнитных носителях, сервисные программы для создания и обслуживания сайта. Но взамен размещает свою баннерную рекламу на вашем сайте.

Хостинг -провайдеры характеризуются:

    техническими ресурсами, к которым относятся ЭВМ, каналы связи, маршрутизаторы, которые определяют такую характеристику, как скорость отклика.

    Скорость отклика сайта - это характеристика провайдера, которая связана с загрузкой его каналов. Например, провайдер имеет выход в Интернет, соединяясь по радиоканалу с другим провайдером, имеющим спутниковую связь. Канал может быть перегружен, и для связи с Интернетом через такого провайдера может понадобиться большое время. Большое значение также имеет связь локальных ЭВМ с провайдером (телефонный канал, количество телефонов для подключения локальных ЭВМ и др.);

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

    Например, предоставление вам ЭВМ провайдера - и предоставление вам площадки для установки вашей ЭВМ различаются тем, что если вы устанавливаете у провайдера свою ЭВМ, то ее никто из сотрудников провайдера не имеет права трогать (но в договоре можно оговорить, что ремонт отказавшей ЭВМ проводится сотрудниками провайдера) - это ваша ЭВМ, тогда как если вам предоставлена ЭВМ провайдера, то ее могут заменить на другую без согласования с вами;

    программными ресурсами провайдера: какая операционная система используется (80% провайдеров работает под Unix ), какое программное обеспечение используется для сервиса WWW (чаще всего - сервер Apache ), какие виды сервиса разрешены и обеспечиваются провайдером (например, часто запрещаются ftp и telnet ).

    Программные ресурсы провайдера характеризуются также программным обеспечением, предоставляемым клиентам (компиляторы, интерпретаторы, СУБД, предустановленные скрипты, управляющие интерфейсы (мастера и шаблоны), и т.д.). Этот состав очень важен для размещения созданного сайта у хостинг -провайдера, так как провайдер может плохо относиться к продукции фирмы и не поддерживать конструкции FrontPage и другие расширения операционной системы Windows , а для клиента это программное обеспечение является основным;

    системой безопасности провайдера: для пользователя имеет значение наличие зеркальных серверов, резервных мощностей.

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

    Резервная мощность - это запасные технические средства, которые находятся в резерве (холодном, теплом, горячем). При отказе какой-либо ЭВМ провайдер переключает работу на резервную ЭВМ;

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

Интернет имеет как техническую составляющую, так и бизнес-структуру. Поставщики услуг Интернета (ISP) играют ключевую роль в этой бизнес-структуре; ISP – компании, обеспечивающие соединение клиентов с сетью. Некоторые ISP обслуживают отдельных клиентов и семьи, использующие сетевой доступ из дома; они предоставляют услугу удалённого доступа и компьютерную учетную запись, чтобы позволить клиентам читать электронную почту и просматривать Web. Некоторые ISP обслуживают бизнес-структуры. Эти ISP могут обеспечить высокоскоростные линии для компьютерных систем клиентов или могут предоставить услугу "хостинга", при помощи которой Веб-сайты клиентов постоянно находятся на машине ISP.

Одна группа поставщиков услуг, таких как компании AT&T, MCI и Sprint оперируют сетевыми связями и маршрутизаторами в "Центре" Интернета, называемой магистралью сети (backbone) , через которую осуществляется передача данных на большие расстояния (long-distance Internet traffic). Эти услуги предоставляются в основном для других провайдеров. Многие из поставщиков услуг магистральной сети – также телефонные компании, с сетями, имеющими международный доступ. Данные могут путешествовать тысячи миль через маршрутизаторы по медному или оптическому кабелю, принадлежащему одной компании.

Поставщиками услуг, сфокусированными на розничных клиентах, являются: America Online (AOL), Earthlink, и Mindspring, телефонные компании, такие как AT&T Worldnet, Verizon и многих мелких провайдеров, которые обслуживают некоторые ограниченные зоны. Последние продают высокоскоростные подключения оптом от одного из крупных ISP, чтобы связать их клиентов с глобальным Интернетом. Мелкие локальные провайдеры часто скупаются крупными ISPs, но их все еще много.

Для того чтобы соединить ваш домашний компьютер с Интернетом, ему должен быть назначен IP- адрес. В зависимости от вашего соглашения с провайдером и типа подключения, ваша система, может иметь постоянный IP адрес, или может использовать динамичный IP-address каждый раз, когда вы соединяетесь с сетью. Люди или организации, которым требуется компьютер, все время соединенный с сетью, имеют постоянные адреса IP.



Кроме предоставления связи с сетью и IP-адреса, провайдеры обычно предлагают пакеты услуг, включающих email, доступ к новостям (Netnews) и место на Web сервере для пользователей, желающих создать персональную страницу, которую сможет увидеть любой человек.

Некоторые поставщики услуг также функционируют как контент-провайдеры , то есть их системы содержат информацию, которую могут посмотреть только их клиенты. Например, AOL содержит много страниц о путешествии, спорте, хобби, здоровье и текущих событиях, которые доступны только клиентам AOL; их нет в Web. Prodigy and CompuServe – два других ISP, предлагающих контент, защищенный авторскими правами. Но, со становлением World Wide Web, число контент-провайдеров увеличилось и многие из их материалов свободны и доступны всем. Благодаря Web, контент-провайдеры зарабатывают, продавая рекламные места вместо доступа непосредственно к содержимому. На этом новом рынке удобный почтовый сервис (email) и Web доступ не менее важен для Интернет-провайдеров, чем содержимое.


Модуль 6. Безопасность компьютера

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

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

В соответствии с Spectrum Systems, Inc., с 2002 года:

  • Оценка потерь от компьютерных преступлений составляет от 300 миллионов долларов до 500 миллиардов долларов ежегодно
  • Компьютерные мошенничества, совершаемые в US, превышают 3 миллиарда долларов каждый год.
  • Проникновения через компьютерную защиту растут на 20% в год.
  • 91% респондентов обнаружили нарушения компьютерной безопасности
  • 94% обнаружили компьютерные вирусы
  • 91% обнаружили злоупотребление правами доступа.
  • 40% обнаружили внешнее вторжение.
  • Случаи проникновения были определены. Менее чем у 1% всех компьютеров, в которые совершено проникновение, проникновение было обнаружено.
  • Было сообщено о 34% обнаруженных случаев
  • Существует более 3,000 хакерских сайтов

Чтобы защитить систему, сначала нужно знать, где система может быть уязвима и что могут сделать злоумышленники. Эта информация представлена в разделе Угрозы безопасности (Security Threats ). Затем, в разделе Технологии Безопасности(Security Technologies ), рассказано о современных технологиях защиты данных. Наконец, информация о существующих инструментах и лучших методах для предотвращения и определения вторжения, а также о восстановлении после нападения – приведена в разделах Предотвращение, Обнаружение и Восстановление.

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

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

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

Системы безопасности поддерживают следующее:

  • Конфиденциальность данных – доступ к данным ограничен персоналом с правами доступа
  • Сохранность данных – данные не изменяются непреднамеренно
  • Доступность данных – работают сервисы, обеспечивающие доступ к данным

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

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

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

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

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

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

Начну с повторения: вы не должны вызывать виртуальные функции во время работы конструкторов или деструкторов, потому что эти вызовы будут делать не то, что вы думаете, и результатами их работы вы будете недовольны. Если вы – программист на Java или C#, то обратите на это правило особое внимание, потому что это в этом отношении C++ ведет себя иначе.

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


class Transaction { // базовый класс для всех

public: // транзакций

virtual void logTransaction() const = 0; // выполняет зависящую от типа

// запись в протокол

Transaction::Transaction() // реализация конструктора

{ // базового класса

logTransaction();

class BuyTransaction: public Transaction { // производный класс

// транзакции данного типа

class SellTransaction: public Transaction { // производный класс

virtual void logTransaction() const = 0; // как протоколировать

// транзакции данного типа


Посмотрим, что произойдет при исполнении следующего кода:


BuyTransaction b;


Ясно, что будет вызван конструктор BuyTransaction, но сначала должен быть вызван конструктор Transaction, потому что части объекта, принадлежащие базовому классу, конструируются прежде, чем части, принадлежащие производному классу. В последней строке конструктора Transaction вызывается виртуальная функция logTransaction, тут-то и начинаются сюрпризы. Здесь вызывается та версия logTransaction, которая определена в классе Transaction, а не в BuyTransaction, несмотря на то что тип создаваемого объекта – BuyTransaction. Во время конструирования базового класса не вызываются виртуальные функции, определенные в производном классе. Объект ведет себя так, как будто он принадлежит базовому типу. Короче говоря, во время конструирования базового класса виртуальных функций не существует.

Есть веская причина для столь, казалось бы, неожиданного поведения. Поскольку конструкторы базовых классов вызываются раньше, чем конструкторы производных, то данные-члены производного класса еще не инициализированы во время работы конструктора базового класса. Это может стать причиной неопределенного поведения и близкого знакомства с отладчиком. Обращение к тем частям объекта, которые еще не были инициализированы, опасно, поэтому C++ не дает такой возможности.

Есть даже более фундаментальные причины. Пока над созданием объекта производного класса трудится конструктор базового класса, типом объекта является базовый класс. Не только виртуальные функции считают его таковым, но и все прочие механизмы языка, использующие информацию о типе во время исполнения (например, описанный в правиле 27 оператор dynamic_cast и оператор typeid). В нашем примере, пока работает конструктор Transaction, инициализируя базовую часть объекта BuyTransaction, этот объект относится к типу Transaction. Именно так его воспринимают все части C++, и в этом есть смысл: части объекта, относящиеся к BuyTransaction, еще не инициализированы, поэтому безопаснее считать, что их не существует вовсе. Объект не является объектом производного класса до тех пор, пока не начнется исполнение конструктора последнего.

То же относится и к деструкторам. Как только начинает исполнение деструктор производного класса, предполагается, что данные-члены, принадлежащие этому классу, не определены, поэтому C++ считает, что их больше не существует. При входе в деструктор базового класса наш объект становится объектом базового класса, и все части C++ – виртуальные функции, оператор dynamic_cast и т. п. – воспринимают его именно так.

В приведенном выше примере кода конструктор Transaction напрямую обращается к виртуальной функции, что представляет собой откровенное нарушение принципов, описанных в данном правиле. Это нарушение легко обнаружить, поэтому некоторые компиляторы выдают предупреждение (а другие – нет; дискуссию о предупреждениях см. в правиле 53). Но даже без такого предупреждения ошибка наверняка проявится до времени исполнения, потому что функция logTransaction в классе Transaction объявлена чисто виртуальной. Если только она не была где-то определена (маловероятно, но возможно – см. правило 34), то такая программа не скомпонуется: компоновщик не найдет необходимую реализацию Transaction::logTransaction.

Не всегда так просто обнаружить вызов виртуальной функции во время работы конструктора или деструктора. Если Transaction имеет несколько конструкторов, каждый из которых выполняет одну и ту же работу, то следует проектировать программу так, чтобы избежать дублирования кода, поместив общую часть инициализации, включая вызов logTransaction, в закрытую невиртуальную функцию инициализации, скажем, init:


class Transaction {

{ init(); } // вызов невиртуальной функции

Virtual void logTransaction() const = 0;

logTransaction(); // а это вызов виртуальной

// функции!


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

Но как вы можете убедиться в том, что вызывается правильная версия log-Transaction при создании любого объекта из иерархии Transaction? Понятно, что вызов виртуальной функции объекта из конструкторов не годится.

Есть разные варианты решения этой проблемы. Один из них – сделать функцию logTransaction невиртуальной в классе Transaction, затем потребовать, чтобы конструкторы производного класса передавали необходимую для записи в протокол информацию конструктору Transaction. Эта функция затем могла бы безопасно вызвать невиртуальную logTransaction. Примерно так:


class Transaction {

explicit Transaction(const std::string& loginfo);

void logTransaction(const std::string& loginfo) const; // теперь –

// невиртуальная

// функция

Transaction::Transaction(const std::string& loginfo)

logTransaction(loginfo); // теперь –

// невиртуальный

class BuyTransaction: public Transaction {

BuyTransaction(parameters )

: Transaction(createLogString(parameters )) // передать информацию

{...} // для записи в протокол

... // конструктору базового

static std::string createLogString(parameters );


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

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

Сергей Малышев (aka Михалыч)

Часть 1. Общая теория виртуальных функций

Посмотрев на название этой статьи, вы можете подумать: "Хм! Кто же не знает, что такое виртуальные функции! Это же..." Если это так, можете смело бросить чтение прямо на этом месте.

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

Вообще говоря - материал не очень сложный. И все о чем тут будет говориться, несомненно, можно найти в книгах. Проблема только в том, что вы, пожалуй, не найдете полного изложения всей проблемы в одной, или двух книгах. Для того чтобы написать о виртуальных функциях, мне пришлось "проштудировать" 6 разных изданий. И даже в этом случае я совсем не претендую на полноту изложения. В списке литературы я указываю только основные, те, что натолкнули меня на стиль изложения и содержание.

Весь материал я решил разделить на 3 части.
Давайте в первой части попытаемся разобраться в общей теории виртуальных функций. Посмотрим во второй части их применение (и их мощь и силу!) на каком-либо более-менее жизненном примере. Ну, и в третей части еще поговорим о такой вещи, как виртуальные деструкторы.

Так что же это такое?

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

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

Ну вот, а теперь к делу!

Как известно, согласно правилам С++, указатель на базовый класс может ссылаться на объект этого класса, а также на объект любого другого класса, производного от базового. Понимание этого правила очень важно. Давайте рассмотрим простую иерархию неких классов А, В и С. А будет у нас базовым классом, В - выводится (порождается) из класса А, ну а С - выводится из В. Пояснения смотрите на рисунке.

В программе объекты этих классов могут быть объявлены, например, таким образом.

A object_A; //объявление объекта типа А
B object_B; //объявление объекта типа В
C object_C; //объявление объекта типа С

Согласно данному правилу указатель типа А может ссылаться на любой из этих трех объектов. То есть вот это будет верным:


point_to_Object=&object_C; //присвоим указателю адрес объекта С

А вот это уже не правильно:

В *point_to_Object; // объявим указатель на производный класс
point_to_Object=&object_А; //нельзя присвоить указателю адрес базового объекта

Несмотря на то, что указатель point_to_Object имеет тип А*, а не С* (или В*), он может ссылаться на объекты типа С (или В). Может быть правило будет более понятным, если вы будете думать об объекте С, как особом виде объекта А. Ну, например, пингвин - это особая разновидность птиц, но он все таки остается птицей, хоть и не летает. Конечно, эта взаимосвязь объектов и указателей работает только в одном направлении. Объект типа С - особый вид объекта А, но вот объект А не является особым видом объекта С. Возвращаясь к пингвинам смело можно сказать, что если бы все птицы были особым видом пингвинов - они бы просто не умели летать!

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

class A
{
public:
virtual void v_function(void);//функция описывает некое поведение класса А
};

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

Если в классе В, порожденном от класса А нужно описать коке-то другое поведение, то можно объявить виртуальную функцию, названную опять-таки v_function() .

class B: public A
{
public:
virtual void v_function(void);//замещающая функция описывает некое
//новое поведение класса В
};

Когда в классе, подобном В, определяется виртуальная функция, имеющая одинаковое имя с виртуальной функцией класса-предка, такая функция называется замещающей. Виртуальная функция v_function()в В замещает виртуальную функцию с тем же именем в классе А. На самом деле все несколько сложнее и не сводится к простому совпадению имен. Но об этом чуть позже, в разделе "Некоторые тонкости применения".
Ну, а теперь самое важное!

Вернемся к указателю point_to_Object типа А*, который ссылается на объект object_В типа В*. Давайте внимательно посмотрим на оператор, который вызывает виртуальную функцию v_function()для объекта, на который указывает point_to_Object .

A *point_to_Object; // объявим указатель на базовый класс
point_to_Object=&object_B; //присвоим указателю адрес объекта В
point_to_Object->;v_function(); //вызовем функцию

Указатель point_to_Object может хранить адрес объекта типа А или В. Значит во время выполнения этот оператор point_to_Object-gt;v_function(); вызывает виртуальную функцию класса на объект которого он в данный момент ссылается. Если point_to_Object ссылается на объект типа А, вызывается функция, принадлежащая классу А. Если point_to_Object ссылается на объект типа В, вызывается функция, принадлежащая классу В. Итак, один и тот же оператор вызывает функцию класса адресуемого объекта. Это и есть действие, определяемое во время выполнения программы.

Ну и что нам это дает?

Самое время посмотреть - а что же нам дают виртуальные функции? На теорию виртуальных функций в общих чертах мы взглянули. Пора рассмотреть какую-нибудь реальную ситуацию, где можно уяснить практическое значение рассматриваемого предмета в реальном мире программирования.

Классический пример (по моему опыту - в 90% всей литературы по С++), который приводят в этих целях - написание графической программы. Строится иерархия классов, что-то типа "точка -gt; линия -gt; плоская фигура -gt; объемная фигура". И рассматривается виртуальная функция, скажем, Draw(), которая рисует все это... Скучно!

Давайте рассмотрим менее академичный, но все же графический пример. (Классика! Куда от нее деться?). Попробуем рассмотреть гипотетически принцип, который может быть заложен в компьютерную игру. И не просто в игру, а в основу любого (не важно 3D или 2D, крутого или так себе) шутера. Стрелялки, проще говоря. Я не кровожаден по жизни, но, грешен, люблю иногда постреляться!

Итак, мы задумали сделать крутой шутер. Что понадобиться в первую очередь? Конечно же оружие! (Ну, пусть не в первую. Не важно.) В зависимости от того, на какую тему будем сочинять, такое оружие и понадобится. Может это будет набор от простой дубины до арбалета. Может от аркебуза до гранатомета. А может и вовсе от бластера до дезинтегратора. Скоро мы увидим, что это-то как раз и не важно.

Что же, раз есть такая масса возможностей, надо завести базовый класс.

class Weapon
{
public:
... //тут будут данные-члены, которыми может описываться, например, как
//толщина дубины, так и количество гранат в гранатомете
//эта часть для нас не важна

virtual void Use1(void);//обычно - левая кнопка мыши
virtual void Use2(void);//обычно - правая кнопка мыши

... //тут будут еще какие-то данные-члены и методы
};

Не вдаваясь в подробности этого класса, можно сказать, что самыми важными, пожалуй, будут функции Use1() и Use2(), которые описывают поведение (или применение) этого оружия. От этого класса можно порождать любые виды вооружения. Будут добавляться новые данные-члены (типа количества патронов, скорострельности, уровня энергии, длинны лезвия и т.п.) и новые функции. А переопределяя функции Use1() и Use2(), мы будем описывать различие в применении оружия (для ножа это может быть удар и метание, для автомата - стрельба одиночными и очередями).

Коллекцию вооружения надо где-то хранить. Видимо, проще всего организовать для этого массив указателей типа Weapon*. Для простоты предположим, что это глобальный массив Arms, на 10 видов оружия, и все указатели для начала инициализированы нулем.

Weapon *Arms; //массив указателей на объекты типа Weapon

Создавая в начале программы динамические объекты-виды оружия, будем добавлять указатели на них в массив.

Для того чтобы указать, какое оружие находится в пользовании, заведем переменную-индекс массива, значение которой будем изменять в зависимости от выбранного вида оружия.

int TypeOfWeapon;

В результате этих усилий, код, описывающий применение оружия в игре может выглядеть, например, так:

if(LeftMouseClick) Arms-gt;Use1();
else Arms->Use2();

Все! Мы создали код, который описывает стрельбу-пальбу-войну еще до того, как решили, какие типы оружия будут использоваться. Более того. У нас вообще еще нет ни одного реального типа вооружения! Дополнительная (иногда очень важная) выгода - этот код можно будет скомпилировать отдельно и хранить в библиотеке. В дальнейшем вы (или другой программист) можете вывести новые классы из Weapon, сохранить их в массиве Arms и использовать. При этом не потребуется перекомпиляции вашего кода.

Особо заметьте, что этот код не требует от вас точного задания типов данных объектов на которые ссылаются указатели Arms, требуется только, чтобы они были производными от Weapon. Объекты определяют во время выполнения, какую функцию Use() им следует вызвать.

Некоторые тонкости применения

Давайте немного времени уделим проблеме замещения виртуальных функций.

Вернемся к началу - к скучным классам А, В и С. Класс С на данный момент стоит у нас в самом низу иерархии, в конце линии наследования. В классе С точно также можно определить замещающую виртуальную функцию. Причем применять ключевое слово virtual совсем необязательно, поскольку это конечный класс в линии наследования. Функция и так будет работать и выбираться как виртуальная. Но! А вот если вам приспичит вывести некий класс D из класса С, да еще и изменить поведение функции v_function(), то тут как раз ничего и не выйдет. Для этого в классе С функция v_function() должна быть объявлена, как virtual. Отсюда правило, которое можно сформулировать так: "единожды виртуальный - всегда виртуальный!". То есть, ключевое слово virtual лучше не отбрасывать - вдруг пригодится?

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

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

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

И еще. Виртуальной функцией может быть только нестатическая компонентная функция класса. Виртуальной не может быть глобальная функция. Виртуальная функция может быть объявлена дружественной (friend) в другом классе. Но о дружественных функциях мы поговорим как-нибудь в другой статье.

Вот, собственно, и все на этот раз.

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

Если у вас есть вопросы - пишите, будем разбираться.



Рекомендуем почитать

Наверх