前端面试安全篇

149 阅读5分钟

XSS攻击

XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。

XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。

防范XSS

  • 对字符串进行转义,使得恶意脚本不被执行
  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
  • 验证码:防止脚本冒充用户提交危险操作,防止自动化攻击
  • CSP(建立白名单)CSP 允许你定义哪些来源的资源可以被加载和执行,从而限制潜在的攻击 通常可以通过两种方式来开启 CSP:
  1. 设置 HTTP Header 中的 Content-Security-Policy
  2. 设置 meta 标签的方式 <meta http-equiv="Content-Security-Policy">

CSRF

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

典型的CSRF攻击流程:

  1. 受害者登录A站点,并保留了登录凭证(Cookie)。
  2. 攻击者诱导受害者访问了站点B。站点B收到用户请求后返回一些攻击代码,发出一个请求要求访问站点A的cookie,此时站点B即有了站点A用户的权限
  3. 站点B向站点A发送了一个请求,浏览器会默认携带站点A的Cookie信息。
  4. 站点A接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是无辜的受害者发送的请求。
  5. 站点A以受害者的名义执行了站点B的请求。
  6. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者完成了攻击。

防范CSRF

  • SameSite 可以对 Cookie 设置 SameSite 属性。该属性表示 Cookie 不随着跨域请求发送,可以很大程度减少 CSRF 的攻击,但是该属性目前并不是所有浏览器都兼容。
  • 验证 Referer 对于需要防范 CSRF 的请求,我们可以通过验证 Referer 来判断该请求是否为第三方网站发起的。
  • Token 服务器下发一个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。Token 防护机制通过确保请求中包含有效的令牌,并且该令牌与用户的会话关联,有效地防止了 CSRF 攻击。攻击者无法在未知用户的情况下获得有效的 Token,因此无法成功伪造请求。

点击劫持

点击劫持是指在一个Web页面中隐藏了一个透明的iframe,用外层假页面诱导用户点击,实际上是在隐藏的frame上触发了点击事件进行一些用户不知情的操作。

典型点击劫持攻击流程

  1. 攻击者构建了一个非常有吸引力的网页【不知道哪些内容对你们来说有吸引力,我就不写页面了,偷个懒】
  2. 将被攻击的页面放置在当前页面的 iframe
  3. 使用样式将 iframe 叠加到非常有吸引力内容的上方
  4. 将iframe设置为100%透明
  5. 你被诱导点击了网页内容,你以为你点击的是***,而实际上,你成功被攻击了。

防御点击劫持的方法

  • X-FRAME-OPTIONS

X-FRAME-OPTIONS 是一个 HTTP 响应头,在现代浏览器有一个很好的支持。这个 HTTP 响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。

该响应头有三个值可选,分别是

  1. DENY,表示页面不允许通过 iframe 的方式展示
  2. SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
  3. ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示
  • JS 防御

对于某些远古浏览器来说,并不能支持上面的这种方式,那我们只有通过 JS 的方式来防御点击劫持了。

<head>
  <style id="click-jack">
    html {
      display: none !important;
    }
  </style>
</head>
<body>
  <script>
    if (self == top) {
      var style = document.getElementById('click-jack')
      document.body.removeChild(style)
    } else {
      top.location = self.location
    }
  </script>
</body>

以上代码的作用就是当通过 iframe 的方式加载页面时,攻击者的网页直接不显示所有内容了。

中间人攻击

中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。

防范中间人攻击

使用HTTPS。但是并不是说使用了 HTTPS 就可以高枕无忧了,因为如果你没有完全关闭 HTTP 访问的话,攻击方可以通过某些方式将 HTTPS 降级为 HTTP 从而实现中间人攻击。

DNS劫持

DNS 劫持(DNS Hijacking):又被称为域名劫持,DNS 重定向(DNS direaction),是一种 DNS 攻击方式。即是 DNS 查询没有得到正确的解析,以致引导 user 访问到恶意的网站,从而窃取用户隐私,或者进行某些恶意的操作。

如何防范DNS劫持

1.加强本地计算机病毒检查,开启防火墙等,防止恶意软件,木马病毒感染计算机**

2.改变路由器默认密码,防止攻击者修改路由器的 DNS 配置指向恶意的 DNS 服务器**

3.企业的话可以准备两个以上的域名,一旦一个域名挂掉,还可以使用另一个**

4.用 HTTP DNS 代替 Local DNS