Webservice、WSDL、SOAP之间的关系-2020-10-21

it2025-06-04  8

学习weblogic漏洞的时候遇到了xmldecoder反序列化漏洞,于是研究了一下xml、soap、webservice、WSDL等相关知识,从网上各种搜集+理解+总结如下(部分摘自其他大牛文章)。供参考: Webservice是一种基于Web发布的服务,是一种解决跨平台、跨语言间的应用程序想要相互调用或沟通而设计的技术手段。WSDL+SOAP是webservice这种技术的具体实现。

Webservice使用Web(HTTP协议)方式,接收和响应外部系统的某种(xml格式的)soap请求。从而实现远程调用.

 

SOAP协议规定了跨平台或跨语言的两个应用程序间的消息以何种形式如何传输。soap协议需要依赖于HTTP协议使用的协议,它依赖于HTTP协议创建的传输通道。

soap协议是基于HTTP协议,发送和接受XML格式的数据。

SOAP实例:

<?xml version="1.0"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java version="1.8.0_131" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>id</string> </void> </array> <void method="start" /> </void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body /></soapenv:Envelope> WSDL是webservice描述性语言,类似于接口文档,告知webservice的服务地址以及该webservice服务如何调用。用来和SOAP、HTTP等协议搭配告诉B应用程序该如何与应用程序A沟通和交互。 WSDL实例:

          

<?xml version="1.0" encoding="UTF-8" ?> <definitions name="FooSample"  targetNamespace="http://tempuri.org/wsdl/"  xmlns:wsdlns="http://tempuri.org/wsdl/"  xmlns:typens="http://tempuri.org/xsd"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"  xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <schema targetNamespace="http://tempuri.org/xsd"   xmlns="http://www.w3.org/2001/XMLSchema"   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"   elementFormDefault="qualified" > </schema> </types> <message name="Simple.foo">  <part name="arg" type="xsd:int"/> </message> <message name="Simple.fooResponse">  <part name="result" type="xsd:int"/> </message> <portType name="SimplePortType">  <operation name="foo" parameterOrder="arg" >   <input message="wsdlns:Simple.foo"/>   <output message="wsdlns:Simple.fooResponse"/>  </operation> </portType> <binding name="SimpleBinding" type="wsdlns:SimplePortType">  <stk:binding preferredEncoding="UTF-8" />  <soap:binding style="rpc"   transport="http://schemas.xmlsoap.org/soap/http"/>  <operation name="foo">   <soap:operation soapAction="http://tempuri.org/action/Simple.foo"/>   <input>    <soap:body use="encoded" namespace="http://tempuri.org/message/"     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />   </input>   <output>    <soap:body use="encoded" namespace="http://tempuri.org/message/"     encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />   </output>  </operation> </binding> <service name="FOOSAMPLEService">  <port name="SimplePort" binding="wsdlns:SimpleBinding">   <soap:address location="http://carlos:8080/FooSample/FooSample.asp"/>  </port> </service> </definitions> 注解: 第一行申明该文档是XML。尽管这并不是必需的,但它有助于XML解析器决定是否解析WSDL文件或只是报错。第二行是WSDL文档的根元素:<definitions>。一些属性附属于根元素,就像<schema>子元素对于<types>元素。   <types>元素包含了Types栏。如果没有需要声明的数据类型,这栏可以缺省。在WSDL范例中,没有应用程序特定的types声明,但我仍然使用了Types栏,只是为了声明schema namespaces。   <message>元素包含了Messages栏。如果我们把操作看作函数,<message>元素定义了那个函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相隔离--输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出<message>元素以"Response"结尾,就像以前所用的"fooResponse"。每个<part>元素都有名字和类型属性,就像函数的参数有参数名和参数类型。   用于交换文档时,WSDL允许使用<message>元素来描述交换的文档。   <part>元素的类型可以是XSD基类型,也可以是SOAP定义类型(soapenc)、WSDL定义类型(wsdl)或是Types栏定义的类型。   一个PortTypes栏中,可以有零个、单个或多个<portType>元素。由于抽象PortType定义可以放置在分开的文件中,在某个WSDL文件中没有<portType>元素是可能的。上面的例子里只是用了一个<portType>元素。而一个<portType>元素可在<operation>元素中定义一个或是多个操作。示例仅使用了一个名为"foo"的<operation>元素。这和某个函数名相同。<operation>元素可以有一个、两个、三个子元素:<input>, <output> 和<fault>元素。每个<input>和<output>元素中的消息都引用Message栏中的相关的<message>元素。这样,示例中的整个<portType>元素就和以下的C函数等效:    int foo(int arg);  WSDL结构 definitions> definitions是wsdl文档的根节点,定义了Web服务的名称 <types> definition of types........ 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统). types 定义的是数据类型,可以在message元素中进行引用,他的存在形式可能是type也可能是element </types> <message> definition of a message.... 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。 message 用来定义每个soap服务的入参和出参,包括参数名,参数类型信息。 </message> <portType> definition of a port....... 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。 porttype定义了一个接口的入参和出参,每个portType元素实际上对应了一个接口,就像springMVC当中controller当中定义的一个有@RequestMapping注解的方法一样,他描述了这个方法的入参和出参。 </portType> <binding> definition of a binding.... 特定端口类型的具体协议和数据格式规范的绑定。 bingding 元素对应的type属性标识了对应的portType元素 这里的operation对应了上面对应bingding元素中的operation, </binding> <service> 相关服务访问点的集合。 </servie> </definitions>

 

 

WSDL各部分逻辑关系

采用倒序的方式查看一个wsdl文档的各个部分:

首先看service元素:service是端口(portType)的集合,定义Web服务支持的端口。除了name外,service的核心部分是port(1个service里可以包含多个port),一个port可以理解成一个服务,每个port关联了上面定义的binding元素,指定了该port的地址addressing(一个http链接),这个addressing用来为该binding提供服务。倒数第二个是binding元素:用于传输portType操作,可以为单个portType指定多个绑定。name指该binding的名字,type属性指该binding与上面的哪个portType是绑定(即关联)的,transport属性表面了传输方式(包括HTTP GET,HTTP POST或SOAP),operation定义了该binding的相关操作内容(一个binding中可以声明多个operation),每一个operation的name都将在下面的service中被引用,每一个operation都有一个soapaction,该soapaction指定了一个http链接地址(该服务所在地址),每一个operation可以有多个input属性或多个output属性或多组input、output属性,这些input指定了输入和输出消息的详细信息,每一个input或output里面可以包含body属性。倒数第三个是portType元素:portType是端口(对应一个服务),每个portType元素实际上对应了一个接口,定义了一个接口的入参和出参,每一个portType的name指该portType的名字,这个名字在下面对应绑定的binding元素的type属性中被引用。每一个portType可以有多个operation,每一个operation可以有多个input属性或多个output属性或多组input、output属性。倒数第四个是message元素:message是消息,用来定义每个soap服务的入参和出参,包括参数名,参数类型信息,输入描述Web服务的参数,输出描述Web服务的返回数据。每条消息包含零个或多个<part>参数,每个参数对应一个Web服务函数的参数。每一个message的element在上面types的schema中被定义,在下面相对应的binding的operation的name中被引用。倒数第五个是types元素:types元素定义了WSDL中的相关类型。

 

最新回复(0)