質問

内蔵されている PHP の拡張子 SOAP 受信メッセージのすべてを検証するわけではありません SOAP に対する要求 XML Schema の中に WSDL. 。基本的なエンティティの存在はチェックしますが、次のような複雑なものがある場合は、 simpleType 拡張機能は制限の存在をほとんど無視します。

を検証する最良の方法は何ですか SOAP に対する要求 XML Schema に含まれる WSDL?

役に立ちましたか?

解決

この問題については何時間も調査してきました。ネイティブ PHP SoapServer も NuSOAP ライブラリも検証を行いません。PHP SoapServer は単純に型キャストを行います。たとえば、次のように定義すると

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

そして提出してください

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

php Type boolean (true) を取得します。

NuSOAP は単純な型を認識しますが、単純にすべてを文字列にキャストします。

nuSOAP デバッグ ログから:

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

したがって、最善の方法は、自分自身を検証するか、XERCES のような XML パーサーを使用する joelhardi ソリューションです。

他のヒント

ネイティブの PHP5 SOAP ライブラリのほかに、現時点では PEAR ライブラリも Zend SOAP ライブラリもメッセージのスキーマ検証を行わないことも言えます。(残念ながら、これに対応する PHP SOAP 実装を私は知りません。)

私がやるべきことは、XML メッセージを DOMドキュメント オブジェクトを取得し、DOMDocument のメソッドを使用してスキーマに対して検証します。

通常、WSDL に対して検証は行われません。WSDL が適切に設計されている場合は、リクエストの本文を検証するための基礎となる XML スキーマ (XSD) が存在するはずです。XML パーサーはこれを実行できるはずです。

残りは、Web サービスを実装する方法と、使用する SOAP エンジンによって決まります。私は PHP エンジンについては直接詳しくありません。WSDL/インターフェイスレベルの「検証」の場合、私は通常次のようなことを行います。

  1. リクエストの本文は既知のリクエスト タイプと一致しており、(XSD によって) 有効ですか?
  2. このコンテキストではメッセージは意味をなしますか?また、メッセージを操作/ハンドラーにマッピングできますか?
  3. その場合は処理を開始してください
  4. さもないと:エラー

検証を実行する簡単な方法が見つからず、最終的にはビジネス ロジックに検証コードを含めることになりました。

少し前に私が作成した 概念実証 PHP を使用した Web サービス NuSOAP. 。入力が検証されるかどうかはわかりませんが、検証されると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top