#安全

#钓鱼攻击

超链接 target="_blank" 要增加 rel="nofollow noopener noreferrer" 来堵住钓鱼安全漏洞。如果你在链接上使用 target="_blank" 属性,并且不加上 rel="noopener" 属性,那么你就让用户暴露在一个非常简单的钓鱼攻击之下。

#区分跨站与跨域

跨站必跨域,跨域不一定跨站(比如端口不同) MDN

#XSS Cross Site Scripting 跨站脚本攻击

  • 存储型 XSS 攻击:例如博客网站内,用户发表包含恶意脚本的推文,截断原字符串,则脚本每次被浏览都会直接被浏览器执行

  • 反射型 XSS 攻击:是通过 URL 参数直接注入,一般是使用 alert 来探测站点是否防御,直接攻击的使用 src 来引入自己的脚本。

#CSP Content Security Policy 内容安全策略

github控制台输入await fetch('https://httpbin.org/get')

会被 CSP 阻止

外部域名的加载请求,包括脚本图片等等都可以被 CSP 拦截,是最好的防止 XSS 的方法

具体策略

#内联脚本

配置 CSP 后默认是禁止了内联脚本执行的

如果想要执行内联脚本(减少请求等等),可以配置script-srcunsafe-inline

但是这样会重新有 XSS 的风险

所以需要使用 <script nonce=''/> nonce 属性

CSP 响应头每次都生成并返回一个随机字符串,然后将内联脚本进行处理,给每个脚本加上 nonce 属性,这样页面内只有服务器返回的 script 可以执行

#CSRF Cross-site Request Forgery 跨站请求伪造

假网站通过恶意引导用户点击付款,因为携带了 支付宝(例子)cookie 所直接支付

类型

  • GET:HTTP 请求
  • POST:自动提交的表单
  • 链接:需要点击

而现在有了 SameSite 属性,跨域请求会默认不携带 cookie,这样跨站必跨域,跨站请求伪造就失效了

如果在跨域情况下需要发送 Cookie 响应头需要配置access-control-allow-origin: <origin> Access-Control-Allow-Credentials:truefetch请求需要配置credentials: include

如果需要跨站则配置 SameSite 为 None,再指定 Cookie 属性 Secure 在 HTTPS 下发送来保证安全

#点击劫持

通过 iframe 嵌入支付宝到钓鱼网站中

通过响应头避免网站被 iframe 嵌入到其他网站

  • X-Frame-Options: DENY 禁止网站被嵌入其他网站
  • Content-Security-Policy: frame-ancestors none 控制 允许的 iframe 内容的父级元素

#参考资料

mdn