PHP SoapClient请求作为客户端IP而不是服务器IP接收

PHP SoapClient请求作为客户端IP而不是服务器IP接收,php,soap,Php,Soap,我试图在另一个域上运行SOAP方法,该方法必须从白名单上的IP地址接收,但WSDL似乎不知何故认为请求来自客户端而不是服务器。该调用从表单收集信息,使用AJAX发布到PHP函数,该函数将字段格式化为API友好的格式,然后通过PHPSOAPClient发送 我认为最好的方法是调查SoapClient发送的头,但是头没有列出任何IP地址(主机、连接、用户代理、内容类型、SOAPAction和内容长度) 首先,我阅读了SOAP端点的文档。它显然没有指定要传递的任何特定参数,这无论如何都没有意义,因为我

我试图在另一个域上运行SOAP方法,该方法必须从白名单上的IP地址接收,但WSDL似乎不知何故认为请求来自客户端而不是服务器。该调用从表单收集信息,使用AJAX发布到PHP函数,该函数将字段格式化为API友好的格式,然后通过PHPSOAPClient发送

我认为最好的方法是调查SoapClient发送的头,但是头没有列出任何IP地址(主机、连接、用户代理、内容类型、SOAPAction和内容长度)

首先,我阅读了SOAP端点的文档。它显然没有指定要传递的任何特定参数,这无论如何都没有意义,因为我只能伪造一个IP地址。然后,我阅读了有关的文档。有趣的是,我找不到IP地址设置的确切位置,但我确实找到了一条注释,其中提到使用了
'stream\u context'
,但也没有找到

我还记录每个请求,包括
$\u SERVER['SERVER\u ADDR']
$\u SERVER['REMOTE\u ADDR']
,这两个服务器都报告了预期的IP地址;技术支持人员告诉我,他们正在接收来自
'REMOTE\u ADDR'
值的请求

我尝试发送一个简单的请求,并期望得到一个不同的错误除了IP地址,但我不断得到IP地址问题


有没有什么方法可以更确定我发送的SOAP请求使用的是正确的(服务器)IP?

好的,所以我发现不可能获得服务器IP而不是客户端IP。非常不幸


我想您必须通过使用login/pass来跟踪凭据,因为您遇到了相同的问题。你有两个解决方案。两者都需要额外的步骤来调用web服务

1) 用于访问通过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) 用于同样的目的

这样,您将把服务器ip传递给Web服务。您还可以通过在php soap(本例)中检查调用方的ip(在您的情况下是唯一的服务器ip)来保护页面


又快又脏。

好吧,我想出来了——至少在我自己的情况下。您阅读的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地址。所以别忘了

这是一个棘手的问题,因为这个问题并没有真正清楚地说明实际涉及到哪些系统,在哪里以及使用了什么类型的IP白名单

使用SOAP时,有关服务的主要信息源包含在WSDL资源中。它应该通过HTTP请求获得,如果主资源的XML具有
xi:include
元素,它可能会触发额外的HTTP请求。所有这些请求都来自充当SOAP客户端的系统。您不能在此处选择要使用的IP地址(除非您有一个非常奇特的设置,即两个接口都有到目标系统的有效路由,并且选择正确的IP是应用程序的任务-我不认为这里是这种情况,我不再考虑它-您需要为此配置一个,设置选项,并将其传递到SoapClient)

在WSDL内部,包含真实SOAP服务器的URL。请注意,服务器本身可能位于与WSDL描述完全不同的域上,尽管这种设置也不常见。您可以通过向
SoapClient
传递一个选项数组来覆盖该位置,方法是输入
“location”=>"http://different.domain.example/path/to/service“
。这不会更改WSDL资源的加载,但对SOAP服务的所有请求都将转到该不同的基本URL

该调用从表单收集信息,使用AJAX发布到PHP函数,该函数将字段格式化为API友好的格式,然后通过PHPSOAPClient发送

这里提到了大量的客户端和服务器。提到了AJAX,这让我相信涉及到了浏览器。这是system 1,充当客户端。一个请求被发送到一些PHP。这个目标是system 2,充当这里的服务器。它转换它,充当客户端,将SOAP请求发送到system 3,后者充当另一个客户端服务器

那么白名单在哪里呢?如果它在系统3上,它必须列出系统2使用的IP。请注意,每台联网计算机都有多个IP地址:至少是来自该网络设备的IP地址,加上127.0.0.1。在IPv6中,每个设备甚至有多个地址。使用
$\u SERVER['SERVER\u ADDR']
在这里没有真正的意义-此外,传输方式上的系统,如透明代理,也可能会影响IP。您不应该使用服务器地址作为白名单的条目。您应该真正检查外壳上的网络设置,以了解使用的网络设备及其IP。或者询问服务器您将要联系以检查他们看到的IP

我还记录了每个请求,包括
$\u SERVER['SERVER\u ADDR']
$\u SERVER['REMOTE\u ADDR']
,这两个服务器都按预期报告了IP地址;技术支持人员告诉我,他们正在接收来自“REMOTE\u ADDR”值的请求

这是一件奇怪的事情。系统2上的服务器地址和远程地址按预期设置。我认为远程地址是系统1的IP,服务器地址是系统2的IP。但是系统3看到了系统1的IP?这里发生了什么?我真的想从原始海报上得到更多反馈,但是任务