罗大神语录之反向代理获取真实ip

2018-08-28  本文已影响32人  李相赫的乐芙兰

为了解决nginx反向代理后获取不到ip(通过forward获取不够安全的问题)

先定义一个自定义的ip传递字段:nipYc59oL4Pm

nginx在代理后,往header中的此字段写入真实的连接ip

server {

    listen        80;

    server_name  example.com *.example.com;

    location / {

        proxy_pass        http://localhost:5000;

        proxy_http_version 1.1;

        proxy_set_header  Upgrade $http_upgrade;

        proxy_set_header  Connection keep-alive;

        proxy_set_header  Host $host;

        proxy_cache_bypass $http_upgrade;

        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header  X-Forwarded-Proto $scheme;

        proxy_set_header  $nipYc59oL4Pm;

proxy_set_header  nipYc59oL4Pm $remote_addr;

    }

}

罗金海(罗金海) 08-27 11:15:06

1,不用 X-Forwarded-For 的原因:

    用户可以模拟发送这个名字的头上来,于是就做了假

2,不用X-Real-IP的原因

    百度一下就发现大家都用这个名字,容易被猜测

罗金海(罗金海) 08-27 11:15:58

所以,大家以后有相似的问题一定要注意:

如果IP是有意义的,一定不能使用“X-Forwarded-For”因为会被作假

还有就是web服务端,类似下面的代码是不可取的

if (exists(header["x-real-ip"]))

  return header["x-real-ip"];

else

  return remote_addr();

罗金海(罗金海) 08-27 11:17:33

看似是方便了两种方案都可以获取到

罗金海(罗金海) 08-27 11:17:49

事实上是给获取ip提供了造假的可能性

罗金海(罗金海) 08-27 11:18:48

正确的话一定要用配置

if (config["UseProxyHeaderIP"]))

  return exists(header["x-real-ip"]) ? header["x-real-ip"] : remote_addr();

else

  return remote_addr();

罗金海(罗金海) 08-27 11:19:13

x-real-ip最好修改成一个随机字符串

罗金海(罗金海) 08-27 11:20:34

http头基本上都不区分大小写,程序里面习惯用大写

上一篇下一篇

猜你喜欢

热点阅读