关于前端:XSS和CSRF

7次阅读

共计 2388 个字符,预计需要花费 6 分钟才能阅读完成。

xss

xss 概念

Cross-Site Scripting(跨站脚本攻打)简称 XSS,是一种代码注入攻打。攻击者通过在指标网站上注入歹意脚本,使之在用户的浏览器上运行。利用这些歹意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

为了和 CSS 辨别,这里把攻打的第一个字母改成了 X,于是叫做 XSS。

XSS 的实质是:恶意代码未经过滤,与网站失常的代码混在一起;浏览器无奈分辨哪些脚本是可信的,导致歹意脚本被执行。

而因为间接在用户的终端执行,恶意代码可能间接获取用户的信息,或者利用这些信息假冒用户向网站发动攻击者定义的申请。

在局部状况下,因为输出的限度,注入的歹意脚本比拟短。但能够通过引入内部的脚本,并由浏览器执行,来实现比较复杂的攻打策略。

xss 分类

依据攻打的起源,XSS 攻打可分为存储型、反射型和 DOM 型三种。

类型 存储区 * 插入点 *
存储型 XSS 后端数据库 HTML
反射型 XSS URL HTML
DOM 型 XSS 后端数据库 / 前端存储 /URL URL

JavaScript

  • 存储区:恶意代码寄存的地位。
  • 插入点:由谁获得恶意代码,并插入到网页上。

存储型 XSS

存储型 XSS 的攻打步骤:

  1. 攻击者将恶意代码提交到指标网站的数据库中。
  2. 用户关上指标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接管到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者假冒用户的行为,调用指标网站接口执行攻击者指定的操作。

这种攻打常见于带有用户保留数据的网站性能,如论坛发帖、商品评论、用户私信等。

反射型 XSS

反射型 XSS 的攻打步骤:

  1. 攻击者结构出非凡的 URL,其中蕴含恶意代码。
  2. 用户关上带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接管到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者假冒用户的行为,调用指标网站接口执行攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

反射型 XSS 破绽常见于通过 URL 传递参数的性能,如网站搜寻、跳转等。

因为须要用户被动关上歹意的 URL 能力失效,攻击者往往会联合多种手段诱导用户点击。

DOM 型 XSS

DOM 型 XSS 的攻打步骤:

  1. 攻击者结构出非凡的 URL,其中蕴含恶意代码。
  2. 用户关上带有恶意代码的 URL。
  3. 用户浏览器接管到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者假冒用户的行为,调用指标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻打中,取出和执行恶意代码由浏览器端实现,属于前端 JavaScript 本身的安全漏洞,而其余两种 XSS 都属于服务端的安全漏洞。

XSS 攻打的预防

1 输出过滤:在用户提交时,由前端与后端都须要校验下是否符合规范
2 纯前端渲染 在纯前端渲染中,咱们会明确的通知浏览器:上面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是款式(.style)等等。浏览器不会被轻易的被坑骗,执行预期外的代码了。
3 本义 HTML HTML 的编码是十分复杂的,在不同的上下文里要应用相应的本义规定。
4 防止在字符串中拼接不可信数据。DOM 中的内联事件监听器,如 locationonclickonerroronloadonmouseover 等,<a> 标签的 href 属性,JavaScript 的 eval()setTimeout()setInterval() 等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必防止。在应用 .innerHTML.outerHTMLdocument.write() 时要特地小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量应用 .textContent.setAttribute() 等。
5 Content Security Policy
严格的 CSP 在 XSS 的防备中能够起到以下的作用:

  • 禁止加载外域代码,避免简单的攻打逻辑。
  • 禁止外域提交,网站被攻打后,用户的数据不会泄露到外域。
  • 禁止内联脚本执行(规定较严格,目前发现 GitHub 应用)。
  • 禁止未受权的脚本执行(新个性,Google Map 挪动版在应用)。
  • 正当应用上报能够及时发现 XSS,利于尽快修复问题。

6 其余安全措施

  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者实现 XSS 注入后也无奈窃取此 Cookie。
  • 验证码:避免脚本假冒用户提交危险操作。

CSRF

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

一个典型的 CSRF 攻打有着如下的流程:

  • 受害者登录 a.com,并保留了登录凭证(Cookie)。
  • 攻击者诱惑受害者拜访了 b.com。
  • b.com 向 a.com 发送了一个申请:a.com/act=xx。浏览器会默认携带 a.com 的 Cookie。
  • a.com 接管到申请后,对申请进行验证,并确认是受害者的凭证,误以为是受害者本人发送的申请。
  • a.com 以受害者的名义执行了 act=xx。
  • 攻打实现,攻击者在受害者不知情的状况下,假冒受害者,让 a.com 执行了本人定义的操作。

防护策略

  • 阻止不明外域的拜访

    • 同源检测
    • Samesite Cookie
  • 提交时要求附加本域能力获取的信息

    • CSRF Token
    • 双重 Cookie 验证
正文完
 0