标题:获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR) 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Tue, 15 Mar 2016 18:00:43 +0000 作者:jackxiang 地址:http://jackxiang.com/post/8568/ 内容: 背景:对于ip限定缩小范围,最好是采用出口IP通过公司的所有进行放行,而获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR)的,所以最好是nginx在代理时就限定死: deny *.*.*.66; deny *.*.*.79; deny *.*.*.80; deny *.*.*.77; Nginx的日志的最后一个IP并不安全: log_format wwwlog '$remote_addr - $host [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; *.*.*.57 - jackxiang.com [15/Mar/2016:18:02:33 +0800] "GET /h5ds/themes/common/mobile/js/maps/swiper.min.js.map HTTP/1.0" 404 20 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53" 202.*.*.78 分析过程 这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址方法。 function getIP() { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $realip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $realip = $_SERVER['HTTP_CLIENT_IP']; } else { $realip = $_SERVER['REMOTE_ADDR']; } return $realip; } 这个是网上常见获取,ip函数,用这些值获取IP,我们首先要弄清楚,这些数据是从那个地方传过来的。 IP获取来源 1.’REMOTE_ADDR’ 是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。 如:a->b(proxy)->c ,如果c 通过’REMOTE_ADDR’ ,只能获取到b的IP,获取不到a的IP了。 另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。 2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。 HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是http协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。以下以x_forword_for例子加以说明,正常情况下,这个值变化过程。 来自:http://blog.chacuo.net/98.html Generated by Jackxiang's Bo-blog 2.1.1 Release