Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #72, НОЯБРЬ 2006 г.

битва в канале

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #072, стр. 072-028-4


http://127.0.0.1/RemoteObjectPort и telnet 127.0.0.1 5001).

[ваяем клиент.]

Вот мы и добрались до клиента, который тоже будет представлять собой консольное приложение. После создания проекта нам надо будет добавить в него нашу сборку с классом RNN (чтобы это сделать, надо нажать кнопу Add Refference). Теперь самое важное! Чтобы отправить наш класс по сети, нам надо создать его не в самом начале, как это делается обычно

NRR Object = new NRR();

а после того как мы соединимся с сервером. То есть код клиента должен выглядеть вот так:

Программа, посылающая класс серверу

[STAThread] //создаем поток STA

static void Main(string[] args)

{

NRR TransferingObject; //объявляем объект, который будем передавать через канал

RemotingConfiguration.Configure("ClientConf.xml", false); //конфигурируем клиент

TransferingObject = new NRR(); //передаем объект

Console.WriteLine("Sending object to remote server...\n w8");

Console.WriteLine(TransferingObject.Show("notepad")); //выполняем код на сервере

}

Настроим .NET Remoting для клиента. Для этого мы будем писать ClientConf.xml, предварительно добавив его в проект. Рассмотрим конфигурацию клиента:

Файл конфигурации клиента .NET Remoting

<configuration>

<system.runtime.remoting>

<application>

<client>

<wellknown type="NetRemooting_Real.NRR, NetRemooting_Real"

url="http://localhost:5000/RemoteObjectPort" />

</client>

<channels>

<channel ref="http" port="0" />

<channel ref="tcp" port="10000"/>

</channels>

</application>

</system.runtime.remoting>

</configuration>

В конфигурации клиента мы указываем адрес порта для приема объектов (в нашем варианте мы будем передавать объект через http-протокол). Также мы создаем каналы для общения с другими приложениями. Возможно, у читателя возник вопрос: «Почему порты каналов сервера и клиента разные?». Потому что это не соединения сокетов, а каналы, и они только принимают данные, а для отправки данных мы используем тег <client>.

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

[безопасность системы.]

Когда через каналы связываются простые приложения, все происходит так же, как и в нашем примере. Но если поставить приложения на основе технологии .NET Remoting в банк, то невольно встает вопрос безопасности таких соединений, поскольку вторгнуться в канал довольно просто. В предыдущих версиях .NET Framework'a не было поддержки системы безопасности. Осознав то, что перехватить канал будет просто, разработчики все же сделали подобную систему. Поскольку Remoting является документированным только наполовину, то все управление безопасностью мы будем прописывать в xml-конфигах, для этого есть параметры protectionLevel, TokenImpersonationLevel и secure. Первый параметр описывает методы шифрования данных, которых пока что только два: шифровать и не шифровать:). Второй параметр указывает на принцип аутентификации клиента. Параметр secure указывает на включение или выключение системы безопасности в целом. Если считать, что программист не позаботился о безопасности приложения или же использовал Visual Studio 2003, то способы перехвата данных очень просты.

Назад на стр. 072-028-3  Содержание  Вперед на стр. 072-028-5