2011-06-25 52 views
5

假设php通过cgi/mod_php/etc等以web模式运行...

是否可以安全地假设$ _SERVER ['REMOTE_ADDR']将存在,并且更进一步说,它将包含正确的程式化(对不起,术语可能在这里......)ip(1.1.1.1 - > 255.255.255.255?)?

这不是一个有关天气的问题,$ _SERVER ['REMOTE_ADDR']中包含的ip将是发出请求的客户端的真实IP地址,因为我明白这可以通过修改出站tcp来'欺骗'包...

只是简单:

一)将$ _ SERVER [ 'REMOTE_ADDR']如果PHP是在网络模式下运行始终存在。 b)如果$ _SERVER ['REMOTE_ADDR']总是存在,它是否总是包含正确的语法IP?

谢谢。

+0

好问题 - 我认为这两个问题的答案都是“是”,但我对[IPV6](http://en.wikipedia.org/wiki/IPV6)并不完全确定。出于好奇,你为什么需要知道?如果它不是*格式正确的IP,你会在哪一点遇到麻烦? –

+0

刚刚通过已运行(运行良好)多年的代码,但已通过以下验证此信息: isset($ _ SERVER ....)+ ^([1-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5])(\([0-9] |。[1- 9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5])){3}^ 这似乎是完全不必要 –

+0

尽可能符合ipv6 ...在运行此代码的盒子上禁用了ipv6,所以在那个前端没问题(暂时)...再次感谢! –

回答

6

是的,它总是以网页模式出现,并且由于IP地址从二进制表示转换为您所看到的文本格式,所以它始终有效–无法指定IP地址中的无效IP IP标头。

还有一件事:除非你绝对必须处理IP地址,否则不要采取任何特殊格式。例如,IPv6地址较长且包含不同的字符。基本上,处理IP地址是一个不透明的字符串。

+0

非常感谢你! –

+0

我知道这已经过了一年多了。但是,我运行一个使用ip2long的服务器来将关于每次访问的信息存储在数据库中。我的代码是'$ ip = ip2long($ _ SERVER ['REMOTE_ADDR'])',我发现$ ip等于0.为什么会发生这种情况? – Kayla

+0

没关系我的最后一条评论。我的数据库不接受负数。 **请注意,ip2long可以返回一个负值。** – Kayla