7.10. 点击劫持
如 [RFC6819] 第 4.4.1.9 节所述,授权请求容易受到点击劫持攻击,也称用户界面伪装。在这种攻击中,攻击者会将授权端点的用户界面嵌入一个无害的环境中。用户认为自己在和无害的环境交互,例如,点击了某个按钮,但却无意中和授权端点的用户界面进行了交互。反之亦然:用户认为自己在和授权端点交互,但却无意中在覆盖在原用户界面上的、攻击者提供的输入框中,输入了密码。点击劫持攻击可以设计得让用户难以察觉,例如使用几乎看不见的 iframe 叠加在其它元素之上。
攻击者可以利用这种载体,获取用户的认证凭据,改变授予给客户端的访问范围,并且可能访问用户的资源。
授权服务器必须防止点击劫持攻击。[RFC6819] 描述了多种对策,包括使用 X-Frame-Options HTTP 响应头字段,以及 frame-busting JavaScript。此外,授权服务器还应该使用 2 级及以上的内容安全策略(CSP)[CSP-2]。
为了使其有效,必须在授权端点上使用 CSP。如果适用,还必须在用于认证用户和授权客户端的其它端点(如设备授权端点、登录页面、错误页面等)上使用 CSP。这防止了支持 CSP 的用户代理中出现未经授权方的框架。客户端可以允许自身以框架形式,出现在重定向端点所使用的来源之外的其他来源中。因此,授权服务器应该允许管理员为特定客户端配置允许的来源和/或允许客户动态注册这些来源。
使用了 CSP,授权服务器就可以在单个响应头字段中指定多个来源,并使用灵活的模式对其进行限制(详见 [CSP-2]。该标准的第 2 级通过使用限制框架来源的策略(使用 frame-ancestors)和限制允许在 HTML 页面上执行的脚本来源的策略(使用 script-src),提供了一个强大的机制,用于防止点击劫持。下面是这种策略的一个非规范示例:
HTTP/1.1 200 OK
Content-Security-Policy: frame-ancestors https://ext.example.org:8000
Content-Security-Policy: script-src 'self'
X-Frame-Options: ALLOW-FROM https://ext.example.org:8000
...由于某些用户代理不支持 [CSP-2],因此该技术应该与其它技术结合使用,包括 [RFC6819] 中描述的技术,除非授权服务器明确不支持这些传统用户代理。即使在这种情况下,仍然应该采用其它应对措施。