代码之家  ›  专栏  ›  技术社区  ›  Xeoncross

远程地址是否可能为空?

  •  4
  • Xeoncross  · 技术社区  · 14 年前

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

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   Artefacto    14 年前

    这在理论上是可能的,因为这取决于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.
    
        2
  •  3
  •   Mark Stosberg    12 年前

    对。目前,我在Nginx背后的Apache日志中看到了“unknown”的值,这与日志中的正常请求/响应序列类似。我相信这是可能的因为 mod_extract_forwarded 正在根据中的数据修改重置远程地址的请求 X-Forwarded-For 头球。所以,原来的 REMOTE_ADDR 值可能是有效的,但作为传递反向代理和Apache的一部分, 远程地址 在到达应用程序时显示为无效。

    如果您已经安装了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请求。)

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

        3
  •  0
  •   Piskvor left the building Rohit Kumar    14 年前

    嗯,它是保留的,但可以写。我见过写得很糟糕的应用程序,它们乱涂乱画地写满了超新星——脚本是否会覆盖它,例如 $_SERVER['REMOTE_ADDR'] = ''; ?

    除此之外,即使请求是代理的,也应该有代理的地址——它可以是某种内部重写模块吗? mod_rewrite 允许内部重定向,不确定是否会影响此操作?

        4
  •  0
  •   Martin Bean    14 年前

    它不应该是空的,没有什么不能连接到您的web服务。任何连接都必须有一个IP地址来发送和接收数据。这个IP地址是否可信是另一回事。