Aws Amplify Custom Headers Restrict Iframe
网站是部署在 AWS Amplify,是个 Hugo 弄的静态网站。为了解决 Click-Jacking 的安全问题,需要对 iframe 做些设置,不让别的网站可以通过 iframe 嵌入我的网站。
根据参考链接1,根据在 web server 后台做些设置,使得每个 http response header 有特定的值。所以得在 AWS Amplify 后台设置。参考链接2。
我的配置如下,当然下面的配置不只关于 iframe,X-Content-Type-Options
就跟 iframe 没关系。
customHeaders:
- pattern: '**'
headers:
- key: X-Frame-Options
value: DENY
- key: X-Content-Type-Options
value: nosniff
- key: Content-Security-Policy
value: frame-ancestors 'none'
就发现更改了配置,也保存了,但就是没有生效。认真看了参考链接2,得 redeploy 一下。得找到对应的 branch,见下图。
我自己写了个简单的 iframe 本地网页,来加载我的网站,发现还是能嵌入成功。
发现用 AWS Amplify 部署的网站的 http response header 的 key 是小写的,而我另一个用 Nginx 部署的网站的 key 是首字母大写的。这到底有没有区别呢?答案是没区别。参考链接3。
我要怎么判断,现在浏览器加载的就是我刚 redeploy 出来的版本呢?
-
方法一是每次都重新开浏览器的隐身模式,然后看 Headers,参考下图。有时候觉得这方法也有点问题。
-
方法二,用命令行。参考链接4。
curl -I 'Cache-Control: no-cache, no-store' https://www.example.com/
-
方法三,看 response header 里的 last-modified,看这个时间跟网站 deploy 的时间是不是一致。
然后就会发现,我用 iframe 嵌套我的网站时,iframe 加载的网站,并不是最新版的。那怎样让 iframe 加载的是最新版呢?而不是缓存的呢?参考链接5,我就不断地变换 iframe 的 src,或者在链接的末尾加上 ?id=100
,数字 100 可以不断地改成其它的值,这样去加载不同的页面。然后再用上面的方法一,是可以看到 iframe 加载的页面的 header。结果就是有的页面是还是旧的版本,但有的页面就会是新的版本了。
有上图的页面,就算是验证成功了。剩下就等 Amplify 的 CDN 到点更新各个节点网站了。
参考链接:
链接1:How to restrict who can iframe embed my web app?
链接2:AWS Amplify Custom headers
链接3:Are HTTP headers case-sensitive?
链接4:Four ways to read and check HTTP headers
链接5:Preventing iframe caching in browser