Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

客户端的代理IP和真实IP的陷阱

  前几天在一个QQ群里看到了使用“X-Forwarded-For”来伪造IP投票的,顿时害怕了起来。难道我的程序也有这个漏洞?于是稍微研究了下,原来这不是程序语言的问题,而是程序员滥用框架的问题。很多人喜欢有这样那样的框架,甚至连框架的源码都没看过就使用了,各种第三方插件呀库呀搞了一大堆。在获取客户端IP的时候也使用了框架提供的函数,所以才会有这个问题。我的程序都是手工开发的,逻辑是自己把握的,所以不会有这样的问题。
  我们使用客户端IP的时候一般分为两种方式。一种是软性的,比如根据用户IP判断所在地位置返回给用户,这种需求是没有威胁的。而另一种是硬性的,比如投票时避免一个IP多投,这种需求会对数据产生威胁。我们要根据需求的不同使用不同的IP获取方式。由于“X-Forwarded-For”是可以在HTTP头中伪造的,服务器唯一能获取到的无法伪造的IP只有发起HTTP请求的IP。但是这个请求的IP有可能是代理IP,如果要获取地理位置的话不能用这个IP。所以,当我们需要安全性的时候就使用无法伪造的IP,即便它是一个代理IP;当我们不需要安全性,而要给用户提供更好的体验时,就可以使用代理前的IP。
  在PHP中,使用$_SERVER['REMOTE_ADDR']就可以直接获取到发起HTTP请求的IP了,它是安全的。使用$_SERVER['HTTP_X_FORWARDED_FOR']可以获取客户端代理的原IP,但是如果没有使用代理就不会有这个字段,而且它是可以伪造的。很多框架就手贱的使用类似下面的方法获取客户端IP $ip=array_key_exists('HTTP_X_FORWARDED_FOR',$_SERVER)
  ?$_SERVER['HTTP_X_FORWARDED_FOR']
  :$_SERVER['REMOTE_ADDR'];
  程序员要是没看过框架代码直接使用就非常危险。不仅仅是伪造IP投票那么简单,有些程序员甚至觉得IP是安全字符串,入库不需要过滤处理。这就直接带来了一个注入漏洞。不仅仅是PHP,其它编程语言也是一样的,因为这是HTTP层面的东西,和语言本身无关。
  这篇文章的内容虽然不多,但是了解这些还是必要的。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^