You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止通过Hosts文件篡改域名绕过API访问限制?

关于域名篡改绕过CORS/Referrer校验及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:15:32