惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
F
Fortinet All Blogs
爱范儿
爱范儿
博客园 - Franky
MyScale Blog
MyScale Blog
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
B
Blog
P
Proofpoint News Feed
IT之家
IT之家
宝玉的分享
宝玉的分享
D
DataBreaches.Net
S
SegmentFault 最新的问题
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
M
MIT News - Artificial intelligence
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
量子位
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

吹比💨

NFS 服务引发的一次“诡异”应急响应 银狐使用WDAC来对抗杀软 浏览器第三方Cookie保护导致无法使用Github.dev 使用pushState伪造浏览器地址栏 一次排查网站劫持过程流水账 手动导出 Microsoft Authenticator 中的2FA密钥 使用CloudFlare的IP Lists功能来做访问控制 FrontJS网站错误监控插件存在弹窗广告 宝塔面板可能存在未知漏洞的分析与处置方法 CDN厂商解决域前置问题 中文域名那些事 TLS握手指纹(JA3/JA3S)检测恶意软件流量 [A-Z]{2}\d{2}.cc 团伙的一些公开信息 Azure旗下奇怪的静态托管服务 Csrf与浏览器第三方Cookie策略的问题 Pppoe密码嗅探 Publicsuffix那些事 一次有意思的域名追踪 CobaltStrike通信中host字段的获取 CORB那些事 Referrer Policy那些事 使用CloudFlare来为网站开启客户端证书验证 DNS那些事 用flask来在线管理你的iptables 屏蔽掉向日葵的有效方法 帝国cms在防止内容采集方面做的工作 身份验证器是如何验证我们的身份? 利用GoogleAppsScript自动回复短信实现保号 Nginx实用模块 有关跨域请求的一些记录
XFF那些事
榆木 · 2020-10-16 · via 吹比💨

闲来无事,再水一篇。

X-Forwarded-For(XFF)是用来识别通过HTTP代理负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案[1]中正式提出。

普通建站时,我们可以通过REMOTE_ADDR获取网站访客IP信息。但是当我们的网站部署在CDN后时,用户的请求到达源站服务器之前需要先通过CDN服务器,此处REMOTE_ADDR获取的就是CDN回源服务器的地址。XFF参数是由CDN服务器转发原始请求时并加上。

例如自定义的nginx反向代理配置:

location / {
            proxy_pass https://huai.pub;
            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_redirect     off;
    
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
            proxy_set_header   X-Forwarded-For   $remote_addr;
        }

安全性问题与解决方案

  1. 伪造

    问题:

    由于该参数是直接暴露在http头部的。恶意用户就可以直接在请求头对该字段进行伪造。就造成了该参数的不可信任性。

    解决:

    该参数是公用的。我们可以通过使用私有参数来传递用户的真实IP地址。比如CLoudFlare使用的CF-Connecting-IP标头。我们在自建CDN时也可以使用私有参数来防止XFF伪造。也有其他公共CDN支持这类自定义表头,未作深入了解。

  2. 注入

    问题:

    注入建立在伪造之上。很多情况下,需要将访客IP插入数据库统计。由于XFF的可伪造性,获取IP处的功能也容易被开发疏忽,从而不对此处进行安全化处理,会造成SQL注入问题。

    解决:

    此处拿了帝国CMS的相关写法。以供参考。

function GetIP(){ 
	if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')) 
	{
		$ip=getenv('HTTP_CLIENT_IP');
	} 
	elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown'))
	{
		$ip=getenv('HTTP_X_FORWARDED_FOR');
	}
	elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown'))
	{
		$ip=getenv('REMOTE_ADDR');
	}
	elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown'))
	{
		$ip=$_SERVER['REMOTE_ADDR'];
	}
	$ip=addslashes(preg_replace("/^([\d\.]+).*/","\\1",$ip));
	return $ip;
}

另外。True-Client-IP、X-Forwarded-For、X-Client-Ip、X-Real-Ip、True-Client-IP等都属同类。不再赘述。