7.1.1 传输:SOAP over HTTP

Web服务是传输不可知的,但是大部分现行标准文档讨论的是HTTP(对于非ASCII数据是MIME)。因此,在图7-1中,我们将Web服务封装在一个仲裁Web服务通信的通用“服务器”之中。

SOAP封装在用于传输的任何协议之中——最常见的例子是SOAP over HTTP(如果需要通信机密性和完整性则使用HTTPS)。回忆一下,SOAP是用于与Web服务通信的消息协议——它所携带的是什么类型的消息?根据万维网联盟(W3C)SOAP入门书籍所说,“SOAP提供XML文档的定义,可用于在分散的分布式环境中的对等实体之间交换结构化和类型化的信息。它根本上是一种无状态的单向消息交换范例……”。SOAP消息由三个部分组成:信封(Envelope)、首部和主体,如图7-2所示。

图7-2 SOAP消息的图示,展示了信封、主体和首部

在最基本的细节上,在HTTP上封装的SOAP消息和下面这个虚构的股票交易Web服务示例类似(注意信封、首部、主体及其子元素)。还要注意,原始的请求是一个HTTP POST请求。


POST /StockTrader HTTP/1.1
Host: www.stocktrader.edu
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
     <SOAP-ENV:Header>
       <m:quote xmlns:m="http://www.stocktrader.edu/quote"
           env:actor="http://www.w3.org/2001/12/soap-envelope/actor/next"
           env:mustUnderstand="true">
       <m:reference>uuid:9oe4567w-q345-739r-ba5d-pqff98fe8j7d</reference>
       <m:dateAndTime>2010-03-28T09:34:00.000-06:00</m:dateAndTime>
     </m:quote>
   <SOAP-ENV:Body>
        <m:GetQuote xmlns:m="Some-URI">
           <symbol>MSFT</symbol>
        </m:GetQuote>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

对这个虚构Web服务请求的响应可能类似于:


HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    <SOAP-ENV:Body>
       <m:GetQuoteResponse xmlns:m="Some-URI">
            <Price>67.5</Price>
       </m:GetQuoteResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP入侵工具

尽管第一眼看上去可能很复杂,但是SOAP over HTTP和其他基于文本的互联网协议一样容易处理——可能也一样容易操纵!因为Web服务只是HTTP之上的XML,任何HTTP操纵工具(如第1章中讨论过的那些工具)都有效。但是,如果有专门对付SOAP的好工具,为什么要去做那些工作呢?下面列出作者选择的SOAP入侵工具:

·WebService Studio: 这是一个免费工具,有两个非常相似却不相同的版本:一个在http://code.msdn.microsoft.com/webservicestudio20/。另一个在http://webservicestudio.codeplex.com。输入一个WSDL位置,该工具将生成所有可用的方法,并且提供一个交互式的UI用于输入数据。它将显示为你的Web服务请求所创建的原始SOAP请求和响应。这个工具还有一些绝妙的功能,如在一个漂亮的分析树视图里显示WSDL。图7-3显示了工作中的WebService Studio。

·SoapUI: 这是Eviware提供的免费开放源码桌面应用,用于检查、调用和开发Web服务、Web服务模拟和Web服务的仿真、功能、装入和兼容测试。这个杰出的工具提供了和WebService Studio相同的“指点”式功能,而且还提供了强大的脚本语言,用于创建复杂或者动态的测试方案。

·WSDigger: 这是Foundstone提供的免费工具,进行一些非常简单的自动化测试,如针对Web服务的XPath注入、SQL注入和命令执行。它不像WebService Studio那么灵活,但是确实具备了打印出显示找到的任何Web服务漏洞的漂亮报告的能力,这种能力使其成为非常有用的工具。

·WSFuzzer: 这是neuroFuzz Application Security LLC发起的一个OWASP项目。这个免费工具用Python编写,执行Web服务的自动化fuzzing测试。它提供了一些有趣的功能,例如IDS逃避、客户端SSL证书支持和HTML格式报告。

·SoapClient.com: SoapClient有一个漂亮的网页,列出非常有用的Web服务工具,如WSDL校验器、WSDL分析器、SOAP客户和UDDI浏览器。如果需要这些工具,通常可以在这里找到。

图7-3 来自http://code.msdn.microsoft.com的WebService Studio