REMOTE_ADDR可能是空白的吗?

时间:2010-11-25 16:14:15

标签: php networking webserver

据我所知,网络服务器(Apache / Nginx)根据声明的请求用户代理位置提供($_SERVER['REMOTE_ADDR'])。所以我知道他们可以撒谎,但这个值可能是空白的吗?网络接口或网络服务器是否会接受没有正确形成IP的请求?

http://php.net/manual/en/reserved.variables.server.php

4 个答案:

答案 0 :(得分:5)

理论上可行,因为问题取决于http服务器或至少相应的PHP SAPI。

在实践中,我没有遇到过这种情况,除了使用CLI SAPI。

编辑:对于Apache,它似乎总是被设置,因为ap_add_common_vars总是将它添加到最终由Apache模块PHP SAPI读取的表中(免责声明:我对Apache内部的知识非常有限) )。

如果在CGI环境中使用PHP,RFC 3875中的规范似乎保证了这个变量的存在:

4.1.8.  REMOTE_ADDR

   The REMOTE_ADDR variable MUST be set to the network address of the
   client sending the request to the server.

答案 1 :(得分:3)

是。我目前在Apache-behind-Nginx的日志中看到“unknown”的值,看起来像是日志中的正常请求/响应序列。我相信这是可能的,因为mod_extract_forwarded正在根据X-Forwarded-For标头中的数据修改重置REMOTE_ADDR的请求。因此,原始REMOTE_ADDR值可能有效,但作为通过反向代理和Apache的一部分,REMOTE_ADDR在到达应用程序时显示无效。

如果您安装了Perl的libwww-perl,您可以像这样测试这种情况(将example.com更改为您自己的域或应用程序):

HEAD -H 'X-Forwarded-For: ' -sSe http://www.example.com/
HEAD -H 'X-Forwarded-For: HIMOM' -sSe http://www.example.com/
HEAD -H 'X-Forwarded-For: <iframe src=http://example.com>' -sSe http://www.example.com/

(您还可以使用任何其他工具,允许您使用自定义请求标头手工处理HTTP请求。)

现在,请检查您的访问日志以查看他们记录的值,并检查您的应用程序以了解他们如何处理错误的输入。 `

答案 2 :(得分:0)

嗯,这是保留但可写的。我看过写得很糟糕的应用程序,这些应用程序遍布超级全球 - 脚本可能会覆盖它,例如与$_SERVER['REMOTE_ADDR'] = '';

除此之外,即使请求被代理,也应该有代理的地址 - 可能是某种内部重写模块搞乱它(mod_rewrite允许内部重定向,不确定它是否影响这个)?

答案 3 :(得分:0)

它不应该是空白的,并且没有任何内容无法连接到您的Web服务。无论连接什么,都必须具有IP地址才能发送和接收数据。该IP地址是否可以信任是另一回事。