在PHP中验证到WSDL的传入SOAP请求

问题描述:

SOAP的内置PHP扩展不会验证传入的SOAP请求中的所有内容,而不是验证WSDL中的XML Schema。它确实检查是否存在基本实体,但是当你遇到像simpleType限制那样复杂的事情时,扩展名会忽略它们的存在。在PHP中验证到WSDL的传入SOAP请求

验证SOAP请求的最佳方法是什么?WSDL中包含XML Schema

在这个问题上一直在挖掘几个小时。 原生的PHP SoapServer不需要NuSOAP库就可以进行任何验证。 PHP SoapServer只是进行类型转换。 因为如果你定义

<xsd:element name="SomeParameter" type="xsd:boolean" /> 

,并提交实例

<get:SomeParameter>dfgdfg</get:SomeParameter> 

你会得到PHP类型布尔(真)

的NuSOAP只是蒙上寄托都串,尽管它承认简单类型:

来自nuSOAP调试日志的

nusoap_xmlschema: processing typed element SomeParameter of type http://www.w3.org/2001/XMLSchema:boolean 

所以最好的方法是joelhardi解决方案来验证自己或使用一些XML解析器像XERCES

通常,不会针对WSDL进行验证。如果WSDL设计正确,那么应该有一个基础xml模式(XSD)来验证请求的主体。你的XML解析器应该能够做到这一点。

剩下的事情取决于您如何实现Web服务以及您正在使用的SOAP引擎。我不直接熟悉PHP引擎。对于WSDL /接口级别的“验证”,我通常会这样做:

  1. 请求的主体是否匹配已知的请求类型并且它是否有效(通过XSD)?
  2. 该信息在这种情况下是否有意义,我可以将它映射到操作/处理程序?
  3. 如果是这样,开始处理它
  4. 否则:错误
+0

我编辑了问题澄清。 – 2008-09-22 15:43:12

前段时间我已经创建使用NuSOAP PHP a proof of concept Web服务。我不知道它是否验证输入,但我会假设它。

除了原生的PHP5 SOAP库之外,我还可以告诉你,PEAR和Zend SOAP库都不会对目前的消息进行模式验证。 (不幸的是,我不知道有任何PHP SOAP实现)

我会做的是将XML消息加载到DOMDocument对象中,并使用DOMDocument的方法对模式进行验证。

我无法找到任何简单的方法来执行验证,并最终在业务逻辑中有验证码。