6

ホワイトリストに登録された IP アドレスから受信する必要がある別のドメインで SOAP メソッドを実行しようとしていますが、WSDL は、リクエストがサーバーではなくクライアントから送信されていると何らかの形で認識しているようです。この呼び出しは、フォームから情報を収集し、AJAX を使用して PHP 関数に投稿します。この関数は、フィールドを API に適した形式にフォーマットし、PHP SoapClient 経由で送信します。

これを行う最善の方法は、SoapClient で送信されるヘッダーを調査することだと思いましたが、ヘッダーには IP アドレス (Host、Connection、User-Agent、Content-Type、SOAPAction、および Content-Length) がリストされていません。

まず、SOAP エンドポイントのドキュメントを読みました。渡される特定のパラメーターが指定されていないようですが、IPアドレスを偽造できるだけなので、とにかく意味がありません。次に、 PHP SoapClientのドキュメントを読みました。興味深いことに、IP アドレスがどこに設定されているかをまったく見つけることができませんでしたが、使用について言及しているコメントを見つけましたが、'stream_context'それもうまくいきませんでした。

$_SERVER['SERVER_ADDR']また、とを含むすべてのリクエストをログに記録して$_SERVER['REMOTE_ADDR']います。どちらも期待どおりに IP アドレスを報告しています。側の技術サポートは、'REMOTE_ADDR'値から要求を受け取っていることを教えてくれます。

最低限のリクエストを送信してみたところ、IP アドレス以外に別のエラーが発生することが予想されましたが、IP アドレスの問題が発生し続けています。

適切な (サーバー) IP で SOAP リクエストを送信していることをより確実にする方法はありますか?

4

4 に答える 4

5

さて、私はそれを理解しました - 少なくとも私自身の状況のた​​めに。あなたが読んだ PHP マニュアルのコメントは正しかったのですが (同じものについて話していると仮定して)、IP アドレスにもポートを含める必要がありました。したがって、私が最終的に使用したコードは次のとおりです。

$options = array('socket' => array('bindto' => 'xxx.xxx.xx.xxx:0'));
$context = stream_context_create($options);
$client = new SoapClient($url, 
    array('trace' => 1, 'exception' => 0, 'stream_context' => $context));

以前は、「:0」を含めていませんでしたが、単に IP アドレスを含めただけでした。だから忘れないで!

于 2013-07-22T10:04:16.060 に答える
3

これは難しい問題です。この質問では、実際に関与しているシステムや、どこで、どのような種類の IP ホワイトリストが使用されているかを明確に把握できないからです。

SOAP を使用する場合、サービスに関する主要な情報源は WSDL リソースに含まれています。xi:includeこれは HTTP リクエストを介して取得されることが想定されており、プライマリ リソースの XML に要素が含まれている場合は、追加の HTTP リクエストがトリガーされる可能性があります。これらの要求はすべて、SOAP クライアントとして機能するシステムから発信されます。ここで使用する IP アドレスを選択することはできません (両方ともターゲット システムへの有効なルートがあり、適切な IP を選択することがアプリケーションのタスクである 2 つのインターフェイスを持つという非常に風変わりなセットアップがない限り、これは考えられません。ここではそうであり、私はそれについて考えるのをやめます -これにはストリーム コンテキストを構成し、 「bindto」オプションを設定して、それを SoapClient に渡す必要があります)。

WSDL の内部には、実際の SOAP サーバーの URL が含まれています。サーバー自体が WSDL の記述とはまったく異なるドメインにある可能性があることに注意してください。ただし、そのような設定も一般的ではありません。オプション配列をSoapCliententry とともにに渡すことで、その場所をオーバーライドできます"location" => "http://different.domain.example/path/to/service"。これによって WSDL リソースのロードが変更されることはありませんが、SOAP サービスに対するすべての要求は、その別のベース URL に送られます。

この呼び出しは、フォームから情報を収集し、AJAX を使用して PHP 関数に投稿します。この関数は、フィールドを API に適した形式にフォーマットし、PHP SoapClient 経由で送信します。

ここで言及されているクライアントとサーバーはたくさんあります。AJAX が言及されているため、ブラウザーが関与していると思われます。これはクライアントとして機能するシステム 1 です。リクエストが PHP に送信されます。このターゲットは、ここでサーバーとして機能するシステム 2 です。それを変換し、クライアントとして動作して、別のサーバーとして動作しているシステム 3 に SOAP 要求を送信します。

では、ホワイトリストはどこにありますか? システム 3 にある場合は、システム 2 で使用される IP をリストする必要があります。ネットワークに接続されたすべてのコンピューターには複数の IP アドレスがあることに注意してください。IPv6 では、デバイスごとに複数のアドレスさえあります。ここで使用$_SERVER['SERVER_ADDR']することはあまり意味がありません。さらに、トランスポート ウェイ上にあるシステム (トランスペアレント プロキシなど) も IP に影響を与える可能性があります。ホワイトリストのエントリとして SERVER_ADDR を使用しないでください。シェルのネットワーク設定を実際にチェックして、使用されているネットワーク デバイスとその IP を確認する必要があります。または、接続しようとしているサーバーに問い合わせて、どの IP が表示されているかを確認してください。

$_SERVER['SERVER_ADDR']また、とを含むすべてのリクエストをログに記録して$_SERVER['REMOTE_ADDR']います。どちらも期待どおりに IP アドレスを報告しています。側の技術サポートは、「REMOTE_ADDR」値からリクエストを受け取っていると言っています。

これは奇妙なことです。システム 2 の SERVER_ADDR と REMOTE_ADDR は期待どおりに設定されています。これを、REMOTE_ADDR がシステム 1 の IP であり、SERVER_ADDR がシステム 2 の IP であると読みました。しかし、システム 3 はシステム 1 の IP を認識しますか? ここで何が起きてるの?元の投稿者からこれについてもっとフィードバックが欲しいのですが、質問はすでに半年前です。

そして、経験した「IPアドレスの問題」についての適切な説明がありません。それらはどのように見られますか?「接続に失敗しました」というタイムアウトですか、それとも SoapFault をトリガーする 4xx ステータス コードによる適切な HTTP 拒否ですか? この問題は、説明がより適切である場合にのみ、実際に解決できます。

ただし、複雑なコードが含まれている可能性があり、システム 2 で生成された XML がシステム 1 にミラーリングされてからシステム 3 に送信されるため、実際の SOAP 要求は実際にはブラウザー/システム 1 によって送信されるのではないかと思います。少なくとも、システム 1 の IP がシステム 3 に表示される理由を説明します。

于 2013-07-25T20:36:04.537 に答える
1

同じ問題がありました。2 つの解決策があります。どちらも、Web サービスを呼び出すための追加の手順が必要です。

1) file_get_contentsを使用して、php soap を介して実際に WS に問い合わせるページにアクセスします。例:

public function test() {            
    $result = file_get_contents('http://your.domain.com/pages/php-soap?params=your-params');
    header("Content-type: text/xml; charset=utf-8");
    echo $homepage;         
}

2)同じ目的でCURLを使用します。

そうすれば、サーバーの IP を Web サービスに渡すことができます。php-soap (この例) で呼び出し元の IP (この場合はサーバーの IP であり、これは一意です) をチェックインすることで、ページを保護することもできます。

速くて汚い。

于 2013-04-08T07:43:01.947 に答える
1

わかりましたので、クライアント IP ではなくサーバー IP を取得することは不可能であることがわかりました。非常に残念です...

ログイン/パスを使用して資格情報を追跡する必要があると思います

于 2012-12-11T02:20:07.747 に答える