Gray Hat C#, Программирование

#19 Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности. Создание класса SoapMessage для определения отправленных данных.

Здравствуйте, дорогие друзья.

Сообщение SOAP определяет набор данных, которые веб-служба либо ожидает, либо отправляет в ответ для данной операции. Она ссылается на типы и параметры SOAP, ранее проанализированные для представления данных или использования данных из клиентского приложения, и состоит из частей (это технический термин). Пример XML-элемента сообщения SOAP 1.1 представлен в листинге ниже.

Наш класс SoapMessage, который использует элемент XML, подобный показанному в листинге выше, подробно описан в листинге ниже.

The SoapMessage class

Сначала мы присваиваем имя сообщения свойству Name [1], класса SoapMessage. Затем мы создаем экземпляр нового списка частей под названием SoapMessagePart, и перебираем каждый элемент , передавая элемент конструктору SoapMessagePart, и сохраняя новый SoapMessagePart для дальнейшего использования, добавляя его в список частей.


Реализация класса для частей сообщения


Как и предыдущие классы SOAP, которые мы реализовали, класс SoapMessagePart является простым классом, как показано в листинге ниже.

 The SoapMessagePart class
 The SoapMessagePart class

Конструктор класса SoapMessagePart принимает единственный аргумент XmlNode, который содержит имя и тип или элемент части внутри SoapMessage. Класс SoapMessagePart определяет три общедоступных свойства: Имя части, Тип и Элемент, все из которых являются строками. Сначала мы сохраняем имя части в свойстве Name [1]. Затем, если у нас есть атрибут с именем element [2], мы присваиваем значение атрибута элемента свойству Element. Если атрибут элемента не существует, атрибут type должен существовать, поэтому мы присваиваем значение атрибута type свойству Type. Для любой данной части SOAP будут установлены только два из этих свойств: часть SOAP всегда имеет Имя, и, либо Тип, либо Элемент. Тип или элемент будут установлены в зависимости от того, является ли часть простым типом (например, строка или целое число) или сложным типом, включенным в другой элемент XML в WSDL. Нам нужно создать класс для каждого типа параметров, и начнем с реализации класса Type.

Определение операций порта с помощью класса SoapPortType

С классами SoapMessage и SoapMessagePart, определенными для завершения метода ParseMessages() из листинга 3-4, мы переходим к созданию класса SoapPortType, который завершит метод ParsePortTypes(). Тип порта SOAP определяет операции, доступные на данном порту (не путать с сетевым портом), а его анализ подробно описан в листинге ниже.

The SoapPortType class used in the ParsePortTypes() method

Схема работы этих классов SOAP сохраняется: класс SoapPortType в листинге выше определяет небольшой конструктор, который принимает XmlNode из документа WSDL. Для этого требуются два общедоступных свойства: список SoapOperation и строка имени. В конструкторе SoapPortType мы сначала присваиваем свойство Name атрибуту [1] имени XML. Затем мы создаем новый список SoapOperation и перебираем каждый из дочерних узлов в элементе portType. Во время итерации мы передаем дочерний узел конструктору SoapOperation (который мы создадим в следующем разделе) и сохраняем полученный SoapOperation в нашем списке. Пример узла XML из документа WSDL, который будет передан конструктору класса SoapPortType, показан в листинге ниже.

Sample portType XML node passed to the SoapPortType class constructor

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


Реализация класса для портовых операций

Чтобы использовать операции конструктора класса SoapPortType, нам нужно создать класс SoapOperation, как показано в листинге ниже.

The SoapOperation class

Конструктор SoapOperation принимает XmlNode, в качестве единственного аргумента. Первое, что мы делаем, это присваиваем свойству класса SoapOperation под названием Name [1], атрибут имени переданного XML-элемента операции к конструктору. Затем мы перебираем каждый из дочерних узлов, проверяя, заканчивается ли имя элемента на «вход» или «выход». Если имя дочернего узла заканчивается на «вход», мы присваиваем свойству «Вход» имени входного элемента. В противном случае мы присваиваем свойству Output имя выходного элемента. Теперь, когда класс SoapOperation реализован, мы можем перейти к классам, которые нам нужны для завершения метода ParseBindings().

На этом все. Всем хорошего дня!

Цикл статей по Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности.