浏览器安全

189 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、浏览器安全

1、什么是 XSS 攻击?

XSS使用的是<script></script>跨域,XSS(Cross Site Scripting为了与CSS区分,叫做XSS)攻击指的是 跨站脚本攻击 ,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息,如cookie等。

例如,某一博客中有以下代码,就会获取到访问者的cookie

<script>
    console.log(document.cookie)
</script>

XSS的本质是因为网站没有对恶意代码进行过滤,与正常代码混合在一起,浏览器没办法分辨那些脚本是可信的,从而导致了恶意代码的执行。

攻击者可以通过这种攻击方式可以进行以下操作:

  • 获取页面的数据,如DOM、cookie、localStorage;

  • 发送合理请求,占用服务器资源,从而使用户无法访问服务器;

  • 破坏页面结构;

  • 流量劫持(将链接指向某网站);

攻击类型:

  • 存储型: 指的是恶意脚本会存储在目标服务器上,当浏览器请求数据时,脚本从服务器传回并执行。常用于攻击带有用户信息的网站,如论坛发帖,商品评论等

    • 攻击者将恶意代码提交到目标网站的数据库中。

    • 用户打开目标网站时,⽹站服务端将恶意代码从 数据库取出,拼接在 HTML 中返回给浏览器。

    • 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

    • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

  • 反射型: 指的是攻击者诱导用户访问一个带有恶意代码的 URL 后,服务器端接收数据后处理,然后把带有恶意代码的数据发送到浏览器端,浏览器端解析这段带有 XSS 代码的数据后当做脚本执行,最终完成 XSS 攻击。常用于,用url传递参数,如搜索,跳转等。

    • 攻击者构造出特殊URL,包含恶意代码

    • 用户打开url时,⽹站服务端将恶意代码从 url取出 ,拼接在 HTML 中返回给浏览器。

    • 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

    • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

  • DOM型: 指的通过修改页面的 DOM 节点形成的 XSS。取出和执行恶意代码由浏览器完成。前端自身的安全漏洞,剩下两种都是服务器端的安全漏洞

    • 攻击者构造出特殊URL,包含恶意代码

    • 用户打开带有恶意代码的url

    • 用户浏览器接收到响应后解析执行,前端javascript取出URL中的恶意代码并执行。

    • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

2、如何预防 XSS 攻击?

  • 从浏览器的执行来预防,对需要插入到 HTML 中的代码做好充分的转义,例如将 < 换为 &lt;

  • 使用CSP,CSP的本质是建立一个白名单,告诉浏览器那些外部资源可以加载和执行,从而预防恶意代码的注入执行。

    • 通常有两种方式来开启 CSP,一种是设置 HTTP 首部中的 Content-Security-Policy,一种是设置 meta 标签的方式<meta http-equiv="Content-Security-Policy">
  • 对一些敏感信息进行保护,例如cookie可以使用 http-only,使脚本无法获取。

3、什么是 CSRF / XSRF 攻击?

CSRF(Cross Site Request Forgery, 跨站域请求伪造)也称 XSRF,使用的是<img>跨域,是 跨站请求伪造攻击,攻击者诱导用户进入一个第三方网站,然后第三方网站向被攻击网站发送跨域请求。

例如用户登录网站,在网站购买东西,付款时没有密码等一类验证,这时候攻击者发送 <img src='xxx/xxx?id=200' /> (攻击者想要的)的商品,用户打开后查看就会付款。因为已经登录网站,img进行了跨域。

CSRF原理是利用cookie会在同源策略中携带发送给服务器,进而冒充用户

攻击类型:

  • GET 类型的 CSRF 攻击,比如在网站中的一个 img 标签里构建一个请求,当用户打开这个网站的时候就会自动发起提交。

  • POST 类型的 CSRF 攻击,比如构建一个表单,然后隐藏它,当用户进入页面时,自动提交这个表单。

  • 链接类型的 CSRF 攻击,比如在 a 标签的 href 属性里构建一个请求,然后诱导用户去点击。

4、如何预防 CSRF / XSRF 攻击?

  • 通过检查同源策略:服务器查看http请求头中的origin或者referer判断请求是否为允许访问的站点,如果都不存在,直接阻止请求;缺点是:referer是可以伪造的,还会把搜索引擎的链接给屏蔽。一般网页是允许搜索引擎页面请求,所以也很有可能这种请求方式被攻击者利用(referer会告诉服务器这个网页是从那个链接页面过来的)
  • 通过CSRF token进行验证:服务器向客户端发送一个随机数 token,等再次请求时,将token添加到请求参数中,服务器进行验证,解决了cookie单一验证可能被冒用的问题;缺点是:每个请求都需要添加token,比较繁琐;如果多个服务器进行了负载均衡转移到其他服务器上,但是这个服务器session中没有保留token的话,没有办法验证,这种只能通过改变token的构建方式来解决。
  • 通过cookie双重验证:第一次访问服务器时,服务器给cookie一个随机字符串;等再次访问时,将随机字符串添加到url中,服务器验证cookie中的随机字符串是否与url中一致,解决了cookie只能被冒用不能被访问的问题;比CSRF Token验证更加方便简洁,不会涉及到分布式访问的问题;缺点是:如果有XSS攻击,这个预防不了,也不能做到子域名的隔离。
  • 在设置cookie时设置sameSite:限制cookie被第三方使用,避免攻击者利用cookie。有两种情况:第一种是严格模式下,严格模式下什么时候cookie都不能被第三方使用;宽松模式下,在GET请求并页面跳转时,cookie可以被使用

5、什么是中间人攻击? 如何预防?

中间人攻击是攻击者分别在客户端和服务器端建立联系,并交换内容,让客户端和服务器端以为是进行了加密对话,其实整个会话被攻击者控制。

中间人攻击过程:

  • 客户端向服务器端发送请求,这时第三方中间人已经在其中,中间人劫持
  • 服务器端收到请求,将公钥发送给客户端,中间人截取公钥,将伪造的公钥发送给客户端
  • 客户端收到公钥,使用私钥加密hash值,发送给服务器端,中间人截取hash,使用自己的私钥将hash值解密,获得真密钥,获取到内容,再使用伪造的私钥内容发送给服务器端
  • 服务器端用私钥解密或者假的密钥,使用假密钥加密传送给客户端内容

关于加密内容可看:juejin.cn/post/710949…

举例来说,Wi-Fi 路由器就可以被破解用来进行中间人攻击。对于线上的信息交流来说,中间人攻击都是很难防范的,这里有一些小建议:

  • 不要忽视浏览器弹出的证书警告!你可能访问的是钓鱼网站或者假冒的服务器;
  • 公共网络环境下(例如公共 WiFi),没有 HTTPS 加密的敏感网站不要随便登录,一般不可信;
  • 在任何网站上登录自己的账号前确保网址为 HTTPS 加密协议;

6、有哪些可能引起前端安全的问题?

  • XSS跨站脚本攻击
  • CSRF跨站请求拦截
  • iframe的滥用:在表单中,用户可以输入各种内容,如果不加以验证,可能运行脚本信息,flash插件,弹出对话框等,破坏前端用户体验
  • 恶意的第三方库:现在不论前端后端都会用到第三方插件,如果第三方插件中被植入恶意代码,会引起安全问题

7、网络劫持有几种,如何预防?

DNS劫持: (在京东被强制跳转到淘宝这就属于dns劫持)

  • DNS强制解析: 通过修改运营商的本地DNS记录,来引导⽤户流量到缓存服务器

  • 302跳转的⽅式: 通过监控⽹络出⼝的流量,分析判断哪些内容是可以进⾏劫持处理的,再对劫持的内存发起302跳转的回复,引导⽤户获取内容

(2)HTTP劫持: (访问⾕歌但是⼀直有贪玩蓝⽉的⼴告),由于http明⽂传输,运营商会修改你的http响应内容(即加⼴告)

关于http内容可看:juejin.cn/post/710800…

关于https内容可看:juejin.cn/post/710949…

DNS劫持由于涉嫌违法,已经被监管起来,现在很少会有DNS劫持,⽽http劫持依然⾮常盛⾏,最有效的办法就是全站HTTPS,将HTTP加密,这使得运营商⽆法获取明⽂,就⽆法劫持你的响应内容。