日期: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及原理注释[服务器安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Nginx后如安在web利用中获得用户ip及原理注释
  • 在Linux下利用Nginx构建虚拟主机
  • <b>CentOS 利用Nginx做反向代理</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2021 www.qdodge.com. All Rights Reserved .