日期:2012-06-26 21:39:00 来源:本站整理
利用Nginx后如安在web利用中获得用户ip及原理注释[服务器安全]
本文“利用Nginx后如安在web利用中获得用户ip及原理注释[服务器安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
问题后台:
在实际利用中,我们大概需求获得用户的ip地址,比方做异地登陆的判断,大概统计ip拜候次数等,普通情形下我们利用request.getRemoteAddr()便可以获得到客户端ip,但是当我们利用了nginx作为反向代理后,利用request.getRemoteAddr()获得到的就一向是nginx服务器的ip的地址,那这时应当怎么办?
part1:办理筹划
我在查阅资料时,有一本名叫《实战nginx》的书,作者张晏,这本书上有这么一段话“经过反向代理后,由于在客户端和web服务器之间增添了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址”.这句话的意思是说,当你利用了nginx反向服务器后,在web端利用request.getRemoteAddr()(本质上就是获得$remote_addr),获得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法得到用户的真实ip的,但是,nginx是可以得到用户的真实ip的,也就是说nginx利用$remote_addr变量时得到的是用户的真实ip,假如我们想要在web端得到用户的真实ip,就必须在nginx这里作一个赋值操作,以下:
proxy_set_header X-real-ip $remote_addr;
此中这个X-real-ip是一个自定义的变量名,名字可以随便取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获得:
request.getAttribute("X-real-ip")
这样就懂得了吧.
part2:原理介绍
这里我们将nginx里的相关变量注释一下,普通我们会看到有这样一些配置
server {
listen 88;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /{
root html;
index index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-For $http_x_forwarded_for;
}
我们来一条条的看
1. proxy_set_header X-real-ip $remote_addr;
这句话之前已经注释过,有了这句便可以在web服务器端得到用户的真实ip
但是,实际上要得到用户的真实ip,不是只有这一个办法,下面我们持续看.
2. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
我们先看看这里有个X-Forwarded-For变量,这是一个squid开辟的,用于辨认通过HTTP代理或负载均衡器原始IP一个衔接到Web服务器的客户机地址的非rfc尺度,假若有做X-Forwarded-For设置的话,每次经过proxy转发城市有记录,格局就是client1, proxy1, proxy2,以逗号离隔各个地址,由于他是非rfc尺度,所以默许是没有的,需求强迫增添,在默许情形下经过proxy转发的恳求,在后端看来远程地址都是proxy端的ip .也就是说在默许情形下我们利用request.getAttribute("X-Forwarded-For")获得不到用户的ip,假如我们想要通过这个变量得到用户的ip,我们需求自己在nginx增添以下配置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
意思是增添一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增添,而不是覆盖,当然由于默许的X-Forwarded-For值是空的,所以我们总感受X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际被骗你搭建两台nginx在差别的ip上,并且都利用了这段配置,那你会发目前web服务器端通过request.getAttribute("X-Forwarded-For")得到的将会是客户端ip和第一台nginx的ip.
那么$proxy_add_x_forwarded_for又是什么?
$proxy_add_x_forwarded_for变量包含客户端恳求头中的"X-Forwarded-For",与$remote_addr两部份,他们之间用逗号脱离.
举个例子,有一个web利用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户拜候该web通过两台nginx.
在第一台nginx中,利用www.110hack.com
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
目前的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部份是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值今后,X-Forwarded-For变量的值就是用户的真实的ip地址了.
到了第二台nginx,利用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
目前的$proxy_add_x_forwarded_for变量,X-Forwarded-For部份包含的是用户的真实ip,$remote_addr部份的值是上一台nginx的ip地址,于是通过这个赋值今后目前的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧.
最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默许的这个X-Forwarded-For是为空的,所以当我们直接利用proxy_set_header X-Forwarded-For $http_x_forwarded_for时会发现,web服务器端利用request.getAttribute("X-Forwarded-For")得到的值是null.假如想要通过request.getAttribute("X-Forwarded-For")得到用户ip,就必须先利用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;这样便可以得到用户真实ip.
ps:变量名太长,自己感受看着好晕,打字打的我眼睛都花了,但愿注释清楚了,假若有疑问可以和我交流,共同学习.
以上是“利用Nginx后如安在web利用中获得用户ip及原理注释[服务器安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论