我有很多项目的功能依赖于$_SERVER['REMOTE_ADDR]
,$_SERVER['HTTP_X_FORWARDED_FOR']
和$_SERVER['CLIENT_IP']
提供的IP地址。
IPV4地址很容易匹配,因为我们总是以相同的格式接收它们:4个整数没有前导0,用点.
分隔。
可以压缩IPV6地址。例:FF01:0:0:0:0:0:0:101 - > FF01 :: 101
我一直在研究这个问题,但没有发现任何相关内容,所以我要求你的经验。 $_SERVER['REMOTE_ADDR]
使用标准吗?假设它总是以压缩或未压缩的形式接收是否安全?
或者,在尝试测试之前,我应该压缩所有的IPV6字符串吗?
注意:
理想情况下,我希望将IPV6地址作为字符串而不是二进制结构来处理,以提高数据库/源代码的可读性,并允许更容易的IP范围匹配。
答案 0 :(得分:5)
如果先使用inet_pton()
,然后将其转换回inet_ntop()
的字符串,则应该具有一致的字符串表示形式。我不会依赖输入来保持一致......
答案 1 :(得分:2)
CGI spec很明显,任何符合RFC的IPv6地址都有效:
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.
REMOTE_ADDR = hostnumber
hostnumber = ipv4-address | ipv6-address
ipv4-address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
ipv6-address = hexpart [ ":" ipv4-address ]
hexpart = hexseq | ( [ hexseq ] "::" [ hexseq ] )
hexseq = 1*4hex *( ":" 1*4hex )
The format of an IPv6 address is described in RFC 3513 [15].
理智的程序员验证所有输入。因此,您应该将任何环境变量视为污染输入和验证/转换。客户提供的标题,例如X-Forward-For等,应该始终受到怀疑。
那么扩展IPv6地址呢?
此问题包含been asked before和there are several solutions,包括a PEAR one
希望这有帮助!
答案 2 :(得分:1)
IPv6地址的推荐格式位于RFC 5952。
但是,您不能依赖于该格式的所有地址,并且字符串格式对于范围比较尤其糟糕。阅读RFC将让您了解合法表示相同IPv6地址的方式有多少。
你真的应该解析地址(使用其他地方提到的inet_pton
)并对得到的128位字段进行范围比较。
通常情况下,您只会关注64个最重要的位,这些位很适合大多数架构上的long
。