我构建的设计是从本地主机管理,但其中包含的公开数据到互联网或本地网络用户页面的网站。我可以依靠PHP的$ _SERVER ['REMOTE_ADDR']作为将用户标识为本地主机的安全/可靠方式吗? 谢谢!
编辑: 为了澄清,我只关心确定请求是否源自localhost(也许有更好的方法)。
我构建的设计是从本地主机管理,但其中包含的公开数据到互联网或本地网络用户页面的网站。我可以依靠PHP的$ _SERVER ['REMOTE_ADDR']作为将用户标识为本地主机的安全/可靠方式吗? 谢谢!
编辑: 为了澄清,我只关心确定请求是否源自localhost(也许有更好的方法)。
也就是说可变填充有由Apache的设置数据(或其他网络服务器守护进程),并应在识别在连接的另一端的IP地址可靠,是的。检查127.x.x.x(几乎总是127.0.0.1)和:: 1(对于IPv6)。正如Senica所说,它可能并不总是存在的(例如,从命令行运行而不是通过web服务器运行)。但如果它被填满,它应该是可靠的。
为了能够捏造事实,已经有人需要,你不能防止与PHP反正办法相当广泛的访问您的网络和系统。
号这取决于Web服务器上是否REMOTE_ADDR或不供应了。
更正那些。 ..正在考虑HTTP_REFERER。
它应该给你的IP地址...是的。请记住,可能有代理服务器。
'HTTP_REFERER'实际上取决于浏览器,而不是服务器。 –
这可能不是通常适用于从本地主机连接,但你应该采取代理进去。如果远程端使用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信息的安全性,因此它只是一个附注
1)通过使用X-Forwarded-For头信息*而不是* REMOTE_ADDR,你可以给任何人一个很好的方式来非常容易地欺骗他们的IP地址;如果完全使用*,除了REMOTE_ADDR作为元信息2)'isset &&!empty'是多余的,只需'!empty'就可以了。 – deceze
@deceze很多,感谢您的欺骗暗示!我从来没有想过这....到2),这是不正确的,他们是不一样的:检查[这个小提琴](http://phpfiddle.org/lite/code/6c9-8zz) – hek2mgl
我说' isset &&!empty'是毫无意义的,不是它们是一样的。 – deceze
这是相当可靠的,是的。并且不需要澄清,我们理解;) –