为了解决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头基本上都不区分大小写,程序里面习惯用大写