这是动态设置 X-Frame-Options 的安全方法吗?(多个域)

信息安全 Web应用程序 xss 点击劫持
2021-09-09 21:32:10

X-Frame-Options标头将防止您的网站被其他域 iFramed。在接受该ALLOW-FROM指令的浏览器上,您只能指定一个来源。您可以frame-ancestors对现代 UA使用 CSP 2.0指令。

话虽如此,可以根据请求引用者动态呈现响应标头并决定X-Frame-Options在响应中设置哪种类型的标头。

例如,您可以默认提供服务X-Frame-Options: deny,然后在控制器级别呈现deny或根本不发送任何X-Frame-Options标头以允许该请求成为 iFramed。

伪代码:

referer_host = request.referer
if allowed_origins.includes(referer_host)
  response.headers['X-Frame-Options'] = '' # Remove header from response
else
  response.headers['X-Frame-Options'] = 'deny'
end

这种安全机制能被打败吗?攻击者控制的域是否有可能伪造refererUA 将通过一些 javascript 黑客发送的值?

2个回答

据我所知,在正常的浏览会话中插入完全伪造的 Referer 标头是不可能的。但是有多种方法可以确保根本没有发送 Referer 标头。因此,只要您仅在设置了Referer 标头并且明确允许Referer 中的域对您的站点进行构图时才允许被构图,那么您应该是安全的。

但请注意,您应该确保您的检查不会盲目地在Referer 处抛出一些正则表达式来检查,good-site因为这种方式也类似于http://bad-site/good-site/http://good-site.bad-site/将被允许​​陷害您。你不会是第一个犯这种错误的人。

如果你在 IFrame 中有一个 Form,它会导致 POST 出错,因为 Referer 不再是父 html 页面的 url。