HTTP 尝试获取 Client IP
HTTP 中获取 Client IP 相关策略需求, 在当下网络环境中多数只能提供建议作用. 更多的是
通过其它唯一标识来挖掘更多潜在价值.
本文主要就一个内容, 如何最大可能尝试在 HTTP 请求中获取 Client IP.
首先我们要大致了解些先验知识.
1. HTTP header key 不区分大小写
https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
2. X-Forwarded-For 是 HTTP 代理事实标准
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Forwarded-For
X-Forwarded-For: <client ip>, <proxy1 ip>, <proxy2 ip>
3. 大部分网关使用的是 nginx
http {
# 下面三行为重点, 添加后就可以获取到客户端真实 IP
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 下面三行为常见反向代理传递真实客户端 IP 的配置
# 配置在 http{} 中, 则全局应用在下面的所有 server 中
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
https://amos-x.com/index.php/amos/archives/nginx-realip/
https://cloud.tencent.com/developer/article/1521273
基于上面信息, 我们在项目中开始构建脚手架方法
import (
"fmt"
"net"
"net/http"
"strings"
) // X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过 HTTP 代理或者负载均衡服务器,
// 可以被用来获取最初发起请求的客户端的 IP 地址, 这个消息首部成为事实上的标准.
var xForwardedForKeys = [...]string{"X-Forwarded-For", "x-forwarded-for", "X-FORWARDED-FOR"} // XRealIP nginx 反向代理服务 IP
var xRealIPKeys = [...]string{"X-Real-IP", "X-Real-Ip", "x-real-ip", "X-REAL-IP"} // GetClientIP 获取客户端 ip
func GetClientIP(r *http.Request) (ip string) {
// X-Forwarded-For: <client>, <proxy1>, <proxy2>
for _, xForwardedForKey := range xForwardedForKeys {
xForwardedFor := strings.TrimSpace(r.Header.Get(xForwardedForKey))
if len(xForwardedFor) > 0 {
xForwardedFors := strings.Split(xForwardedFor, ",")
ip = strings.TrimSpace(xForwardedFors[0])
if len(ip) > 0 {
return
}
break
}
} for _, xRealIPKey := range xRealIPKeys {
ip = strings.TrimSpace(r.Header.Get(xRealIPKey))
if len(ip) > 0 {
return
}
} // 兜底直接使用 client 请求的 ip 地址
ip, _, _ = net.SplitHostPort(r.RemoteAddr)
return
}
HTTP 尝试获取 Client IP的更多相关文章
- WCF service 获取 client 端的 IP 和 port (转)
转帖记录一下,以便日后使用. 主要使用是.NET3.5里的服务端上下文的消息实例的RemoteEndpointMessageProperty属性,获取客户端地址信息.但是限制 的绑定是HTTP.TCP ...
- C#服务器获取客户端IP地址以及归属地探秘
背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解.一日老婆逛完某宝,问:"为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?" 顺着这个问题我们的探秘 ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- 根据Request获取客户端IP 内网IP及外网IP
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...
- php cli方式下获取服务器ip
(未整理....) (1)php cli方式下获取服务器ip [php] function getServerIp(){ $ss = exec('/sbin/ifconfig et ...
- 获取真实ip的报告
今天登录九秒社团 http://www.9miao.com/的时候忘记了用户名和密码,尝试了5次都没登录成功,网站弹出提示15分钟后才能再次登录.我纳闷它是怎么判断用户的登录次数,这时候用户还没有登录 ...
- C# 之 获取服务器IP,客户端IP以及其它
1.获取客户端IP:Request.ServerVariables.Get("Remote_Addr").ToString(); 2.获取客户端主机名:Request.Server ...
- 分析php获取客户端ip
用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ function getClien ...
- Nginx 反向代理获取真实IP问题
一.前言 前文 Nginx 解决WebApi跨域二次请求以及Vue单页面问题 当中虽然解决了跨域问题带来的二次请求,但也产生了一个新的问题,就是如果需要获取用户IP的时候,获取的IP地址总是本机地址. ...
- WebService(JAX-WS、XFire、Axis三种)获取客户端ip
WebService(JAX-WS.XFire.Axis三种)获取客户端ip JAX-WS.XFire.Axis三种webservice的获取客户端IP的简单实现过程: 1,基于JDK6 jax-ws ...
随机推荐
- 聊一聊 C#线程池 的线程动态注入 (中)
一:背景 1. 讲故事 上一篇我们用 Thread.Sleep 的方式演示了线程池饥饿场景下的动态线程注入,可以观察到大概 1s 产生 1~2 个新线程,很显然这样的增长速度扛不住上游请求对线程池的D ...
- [转]Error: Node Sass does not yet support your current environment: Windows 64-bit
错误日志:Error: Node Sass does not yet support your current environment: Windows 64-bit with Unsupported ...
- 百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现
本文由百度技术团队分享,引用自百度Geek说,原题"百度Android IM SDK组件能力建设及应用",本文进行了排版和内容优化. 1.引言 移动互联网时代,随着社交媒体.移动支 ...
- linux输出文件名及全路径
有时候需要输出一个文件夹下的文件名及所以绝对路径,在网上找到是这个命令 ls | sed "s:^:`pwd`/:" 看命令不难理解,先是ls列出所有文件名,再使用管道符进行后续操 ...
- biancheng-Java设计模式:23种设计模式全面解析(超级详细)
http://c.biancheng.net/design_pattern/ 24种设计模式 1.创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创 ...
- VulNyx - System
扫描发现 2121是ftp端口 8000 http的一个端口 6379redis端口 爆破redis的密码 爆破出来时bonjour 猜测ftp的密码和redis的密码是一样的 尝试用密码去爆出ftp ...
- 浅谈云主机在VPC中进行迁移的使用场景和操作方法
本文分享自天翼云开发者社区<浅谈云主机在VPC中进行迁移的使用场景和操作方法>,作者:刘****雪 一.客户经常遇到的网络迁移问题 客户在天翼云购买一台云主机并且部署完成想要的应用后,发现 ...
- Linux视频播放器安装
sudo add-apt-repository ppa:rvm/smplayer sudo apt-get update sudo apt-get install smplayer PPA: ppa ...
- Flink流处理-简单案例-01
一.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- AI-启动
前言 我们都知道AI可以帮助我们完成很多工作,同时也可以帮助我们快速生成一些繁琐的文档:本篇介绍接入一些开源的大预言模型: 准备 OpenAPI 首先需要了解下什么是OpenAPI,OpenAPI是一 ...