我想知道,在绕过HTTP中的CORS和/或referrer检查时,"域操作"(因为没有更好的术语(是否是真的
现在,我们的团队正在开发一个公共信息网站,该网站可以动态地从SQL Server数据库中提取内容。没有登录;从技术上讲,所有用户都是";匿名">
该网站本身是静态HTML、CSS和jQuery,但在内部运行。NET项目/应用程序(IIS 10.0(。为获取内容数据而调用的API位于单独的中。NET Web API应用程序&应用程序池。
我们正在利用机器对机器JWT身份验证从网站访问API;对于使用的每个API,每次回收/启动应用程序池时,都会向Auth0租户发送一个新的令牌请求,返回一个access_token
并将其存储在Application
变量中。这对我们很有效。
'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
为了进一步加强访问限制,我们使用Web服务对令牌进行加密,然后将其通过请求头传递到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
其首先检查HttpContext。现在的要求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(未授权(错误,这当然是好的
无论如何。。。如果我们要推进这项技术,和/或实现CORS,我们有一个恼人的问题,到目前为止,我还没有在所有的搜索中看到完全的答案:
如何阻止某人创建带有API url链接的自己的页面,然后自定义他们的本地主机文件,使他们的页面拥有我们网站的域,从而通过他们的"访问我们的数据;虚设页">
如果您在其他人的计算机或共享计算机上的Hosts文件中进行"域操作",则您可能会使用他们的凭据和权限进行攻击。
但是,在您自己的计算机上的主机文件中进行域操作不会让您访问您没有的权限或凭据。
如果您在trusted.example.com
上没有凭据或权限,但您更改了自己的主机文件,使您的计算机认为其他站点是trusted.example.com
,那么这仍然无法让您访问realtrusted.example.com
上的任何凭据或权限。
CORS对于一个人在一台计算机上进行域操作来说并不脆弱。仅仅通过在自己的计算机上进行域操作是不可能做出任何邪恶的事情的。
还要考虑一下,要做问题中描述的事情,您甚至不需要管理员权限来更改主机文件;相反,你可以克隆Chrome、Safari或Firefox的源代码,然后对其进行更改,并构建一个浏览器版本,使其认为它运行的是来自trusted.example.com
的可信代码,而实际上它实际上运行的是evil.example.com
的代码。
但是,如果你在trusted.example.com
上实际上没有凭据或权限,那么被黑客入侵的浏览器不会让你访问这些凭据和权限。
为了能够使用这样一个被黑客入侵的浏览器进行攻击,你需要将该浏览器安装到另一台计算机上,而这台计算机正被拥有trusted.example.com
证书和特权的人使用——或者,我想,以某种方式诱骗他们坐在你的计算机旁,导航到trusted.example.com
并登录,等等。
因此,总的来说,如果一个人故意通过问题所描述的"域操作"混淆自己的计算机,那么现实世界中就不会有CORS攻击。