服务端如何安全获取客户端请求IP地址
2017-03-30 19:26 hduhans 阅读(6476) 评论(0) 编辑 收藏 举报服务端如何获取客户端请求IP地址,网上代码一搜一大把。其中比较常见有x-forwarded-for、client-ip等请求头,及remote_addr参数,那么为什么会存在这么多获取方式,以及到底怎样获取才是安全的呢?
remote_addr指的是当前直接请求的客户端IP地址,它存在于tcp请求体中,是http协议传输时自动添加的,不受请求头header所控制。所以,当客户端与服务器间不存在任何代理时,通过remote_addr获取客户端IP地址是最准确的,也是最安全的。
x-forwarded-for简称XFF,它其实和http协议本身并没什么关系,是很多代理服务器在请求转发时添加上去的。如果客户端和服务器之间存在代理服务器,那么直接通过remote_addr获取的IP就是代理服务器的地址,并不是客户端真实的IP地址。因此,需要代理服务器(通常是反向代理服务器)将真实客户端的IP地址转发给服务器,转发时客户端的真实IP地址通常就存在于x-forwarded-for请求头中。
client-ip同x-forwarded-for,也是代理服务器添加的用于转发客户端请求的真实IP地址,同样保存于请求头中。
通过什么参数来获取客户端请求地址是由实际的应用场景决定的:
当客户端与服务器之间不存在代理服务器(尤其指服务端反向代理服务器)时,直接通过remote_addr获取客户端请求IP地址。
当服务器间存在反向代理服务器时,需要在反向代理服务器中转发客户端真实请求IP地址,可以设置x-forwarded-for、client-ip,也可以自定义请求头名称,然后在服务端代码中获取请求头中的该值。需要注意的是,此时必须保证服务器不会绕过代理服务器直接对外提供服务,否则存在IP伪造的风险(客户端伪造设置请求头)。
nginx设置方式:
proxy_set_header x-rewarded-for $remote_addr;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架