如何防止通过Hosts文件篡改域名绕过API访问限制?
问题核心
我想确认域名篡改是否是一种能绕过HTTP中CORS和/或Referrer校验的真实手段,同时需要解决:如何阻止他人通过修改本地Hosts文件,用伪页面冒充我们的站点域名来访问API数据?
现有系统架构与实现
我们正在开发一个无需登录的公共信息站点,技术栈与架构如下:
- 前端:静态HTML、CSS、jQuery,运行在.NET项目(IIS 10.0)中
- 后端API:独立的.NET Web API应用,单独应用池
- 认证方式:机器对机器的JWT认证,应用池启动/回收时向Auth0请求
access_token,存储在Application变量中
令牌获取与存储代码(global.asax.vb)
'from Application_Start in global.asax.vb ("apiHlpr" is a custom class): '. . . For Each apiName As String In apiNameList '<-- pulls specific keys from <appSettings> Dim tkn As String = apiHlpr.GetSignedJWT(apiName, clientID, clientSec) tkn = "Bearer " & tkn Application.Add("keyPrefix_" & apiName, tkn) Next
令牌加密(asmx webservice)
为隐藏明文令牌,通过webservice加密后再传递给API:
'snippet from our asmx webservice ("ourLibrary" is a custom class library): <WebMethod()> Public Function tkn(ByVal name As String) As Object Dim authBearer As String = HttpContext.Current.Application("keyPrefix_" & name).ToString.Trim() Dim strHlpr As New ourLibrary.StringHelper authBearer = strHlpr.EncryptString(authBearer) Dim token As New With { .bearer = authBearer } Return token End Function
API端校验逻辑
API先校验请求的UrlReferrer是否属于本站域名,再解密并验证令牌:
'snippet from our API's controller ("strHlpr" and "apiHlpr" are custom classes): Dim token As String = auth.BearerToken() If auth.ValidReferrer(HttpContext.Current.Request.UrlReferrer) Then token = strHlpr.DecryptString(token) End If Dim status As String = apiHlpr.ValidateToken(token) '''proceed with validation and retrieve data if validated...
'from auth.vb: Public Function ValidReferrer(ByVal ref As Uri) As Boolean If Not IsNothing(ref) Then Dim str As String = ref.ToString Dim domain As String = AppSettings("DOMAINGOESHERE").Trim() If str.ToLower.StartsWith(domain) Then Return True Else Return False End If Else Return False End If End Function
当前防护效果
- 本站正常调用API可获取内容
- 用户在浏览器网络面板只能看到加密后的令牌,无法获取明文
access_token - 直接访问API URL、跨域链接或Postman调用均返回401未授权,符合预期
待解决的棘手问题
如何阻止他人创建自定义页面,通过修改本地Hosts文件将该页面绑定到我们的站点域名,从而绕过Referrer校验访问API数据?
解答
1. 域名篡改(Hosts修改)确实能绕过Referrer校验
是的,修改本地Hosts文件将恶意页面的域名指向自己服务器IP后,浏览器会判定该页面属于你的站点域名,请求的Referrer会显示为你的域名,直接绕过当前的Referrer校验逻辑。同时,CORS是浏览器端的安全机制,攻击者完全可以通过非浏览器环境(如curl、Postman)直接发送请求,绕过CORS限制。
2. 针对性解决方案
(1)移除Referrer校验,改用JWT受众(Audience)校验
在生成JWT时,在Payload中指定aud(受众)字段,明确该令牌仅允许你的API使用。API端验证JWT时,必须校验aud字段是否匹配自身标识符——即使攻击者拿到加密后的令牌并解密,也无法在其他场景复用,Hosts修改也不会影响JWT的aud校验。
(2)缩短令牌有效期
当前令牌存储在Application变量中,有效期可能过长。建议将access_token有效期缩短至15分钟以内,并实现自动刷新机制,降低令牌泄露后的风险。
(3)前端完全隔离令牌
放弃让前端获取加密令牌的逻辑,改用站点后端作为代理:前端请求站点后端接口,由后端直接携带明文JWT调用API,前端全程不接触任何令牌相关内容,从根源上避免令牌泄露风险。
(4)添加API请求签名校验
除JWT外,为每个API请求添加签名:站点后端在调用API时,生成包含请求参数、时间戳、密钥的签名,API端验证签名有效性。即使攻击者拿到令牌,也无法生成有效的请求签名,进一步提升防护等级。
(5)强制HTTPS并校验证书
确保API仅接受HTTPS请求,服务器端开启证书校验,防止中间人攻击。同时使用受信任CA颁发的证书,避免自签名证书带来的安全隐患。
内容的提问来源于stack exchange,提问作者T_O_Massey

