2011-07-16 129 views
9

我构建的设计是从本地主机管理,但其中包含的公开数据到互联网或本地网络用户页面的网站。我可以依靠PHP的$ _SERVER ['REMOTE_ADDR']作为将用户标识为本地主机的安全/可靠方式吗? 谢谢!

编辑: 为了澄清,我只关心确定请求是否源自localhost(也许有更好的方法)。

+0

这是相当可靠的,是的。并且不需要澄清,我们理解;) –

回答

10

也就是说可变填充有由Apache的设置数据(或其他网络服务器守护进程),并应在识别在连接的另一端的IP地址可靠,是的。检查127.x.x.x(几乎总是127.0.0.1)和:: 1(对于IPv6)。正如Senica所说,它可能并不总是存在的(例如,从命令行运行而不是通过web服务器运行)。但如果它被填满,它应该是可靠的。

为了能够捏造事实,已经有人需要,你不能防止与PHP反正办法相当广泛的访问您的网络和系统。

+0

感谢您的回复。本网站旨在部署给客户,供其在自己的服务器上使用。我担心这种方法可能会导致客户在服务器配置中遇到不一致的行为(因为我不能保证甚至会返回任何内容) – leo

+1

然后,您应该执行上述定义的检查。如果没有设置REMOTE_ADDR,它不会作为HTTP请求进入。这种可能性很小(并且任何能够以这种方式运行你的脚本的人都应该足够能够知道存在IP检查)。不要担心边缘情况。如果你检查127.x.x.x和:: 1,你会覆盖所有理智的设置。 –

+0

谢谢你缓解我的偏执狂。 – leo

0

号这取决于Web服务器上是否REMOTE_ADDR或不供应了。

更正那些。 ..正在考虑HTTP_REFERER。

它应该给你的IP地址...是的。请记住,可能有代理服务器。

+0

'HTTP_REFERER'实际上取决于浏览器,而不是服务器。 –

-1

这可能不是通常适用于从本地主机连接,但你应该采取代理进去。如果远程端使用HTTP代理,$_SERVER['REMOTE_ADDR']将包含该代理的IP地址,而不是客户端本身的IP地址。

但是,如果它是一个具有隐私设置中禁用代理,那么你可以使用下面的片段有机会获取客户端IP:

// will be set by the proxy if no privacy is enabled: 
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    return $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else if(isset($_SERVER['REMOTE_ADDR'])) { 
    return $_SERVER['REMOTE_ADDR']; 
} 

但如果你的客户端使用隐私HTTP代理服务器启用,那么你将没有机会获得客户IP。


安全提示(感谢@deceze)请注意,如果你依靠HTTP_X_FORWARDED_FOR头,它会很容易为攻击者欺骗自己的IP。尽管使用其他技术也是可行的,但使用HTTP_X_FORWARDED_FOR标题将非常简单。你被警告了。但无论如何,一个Web应用程序不应该使用IP信息的安全性,因此它只是一个附注

+0

1)通过使用X-Forwarded-For头信息*而不是* REMOTE_ADDR,你可以给任何人一个很好的方式来非常容易地欺骗他们的IP地址;如果完全使用*,除了REMOTE_ADDR作为元信息2)'isset &&!empty'是多余的,只需'!empty'就可以了。 – deceze

+0

@deceze很多,感谢您的欺骗暗示!我从来没有想过这....到2),这是不正确的,他们是不一样的:检查[这个小提琴](http://phpfiddle.org/lite/code/6c9-8zz) – hek2mgl

+0

我说' isset &&!empty'是毫无意义的,不是它们是一样的。 – deceze