Nginx 反向代理 + Flask + gunicorn 架构解决获取用户真实ip问题

flask
我们再来看下如果不用nginx,flask本身获取用户ip的常用方法:

代码结构同上,只是flask中单独作为变量

from flask import request
ip = request.remote_addr
ip = request.http_x_forwarded_for

Nginx + Flask + gunicorn
我们首先要在nginx配置中添加HTTP_X_FORWARDED_FOR 头,用nginx自身的获取ip模块赋值

所以我们可以在nginx配置的server上添加:
vim /etc/nginx/nginx.conf 添加
http{}里面添加

real_ip_recursive on;

vim /etc/nginx/sites-available/default
server 上面添加 请求头

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
server {
        listen  80;
……
……

那么flask中就可以获取headers中的X-Forwarded-For即可,代码如下:

    try:
        real_ip = request.headers['X-Forwarded-For']
        if len(real_ip.split(',')) > 1:
            real_ip = real_ip.split(",")[1]
    except KeyError:
        real_ip = ''

配置好后可以看到nginx对flask的请求,已经带上了X-Forwarded-For

在这里插入图片描述

那么有安全经验的朋友可能会想到X-Forwarded-For头是可以伪造的,那我们来伪造看下nginx的请求会变成什么,

可以看到伪造的8.8.8.8,但同时也可以看到真实的ip,但这个真是ip是抹不掉的,所以我们截取下最后的ip即可

在这里插入图片描述

以上,可见这种方法还是安全可行的。

参考

  1. https://www.vuln.cn/8827
    2.https://www.cnblogs.com/mzhaox/p/11214747.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值