web安全:什么是 XSS 和 CSRF

在 Web 安全领域中,XSS 和 CSRF 是最多见的攻击方式。本文将会简单介绍 XSS 和 CSRF 的攻防问题。html

XSS (Cross Site Script) 跨站脚本攻击

XSS 攻击是指攻击者在网站上注入恶意的客户端代码,经过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。前端

攻击者对客户端网页注入的恶意脚本通常包括 JavaScript,有时也会包含 HTML 和 Flash。有不少种方式进行 XSS 攻击,但它们的共同点为:将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操做。vue

XSS 攻击能够分为 3 类:反射型(非持久型)、存储型(持久型)、基于 DOM。浏览器

XSS 主要是经过输入框等形式提交 js 脚本,最终在页面上被执行。安全

XSS 攻击的防范

如今主流的浏览器内置了防范 XSS 的措施,例如 CSP。但对于开发者来讲,也应该寻找可靠的解决方案来防止 XSS 攻击。bash

HttpOnly 防止劫取 Cookie前端框架

HttpOnly 最先由微软提出,至今已经成为一个标准。浏览器将禁止页面的 Javascript 访问带有 HttpOnly 属性的 Cookie。服务器

上文有说到,攻击者能够经过注入恶意脚本获取用户的 Cookie 信息。一般 Cookie 中都包含了用户的登陆凭证信息,攻击者在获取到 Cookie 以后,则能够发起 Cookie 劫持攻击。因此,严格来讲,HttpOnly 并不是阻止 XSS 攻击,而是能阻止 XSS 攻击后的 Cookie 劫持攻击。cookie

输入检查网络

不要相信用户的任何输入。 对于用户的任何输入要进行检查、过滤和转义。创建可信任的字符和 HTML 标签白名单,对于不在白名单之列的字符或者标签进行过滤或编码。

在 XSS 防护中,输入检查通常是检查用户输入的数据中是否包含 <,> 等特殊字符,若是存在,则对特殊字符进行过滤或编码,这种方式也称为 XSS Filter。

而在一些前端框架中,都会有一份 decodingMap, 用于对用户输入所包含的特殊字符或标签进行编码或过滤,如 <,>,script,防止 XSS 攻击:

// vuejs 中的 decodingMap
// 在 vuejs 中,若是输入带 script 标签的内容,会直接过滤掉
const decodingMap = {
  '&lt;': '<',
  '&gt;': '>',
  '&quot;': '"',
  '&amp;': '&',
  '&#10;': '\n'
}
复制代码

输出检查

用户的输入会存在问题,服务端的输出也会存在问题。通常来讲,除富文本的输出外,在变量输出到 HTML 页面时,可使用编码或转义的方式来防护 XSS 攻击。例如利用 sanitize-html 对输出内容进行有规则的过滤以后再输出到页面中。

CSRF (Cross Site Request Forgery)

CSRF,即 Cross Site Request Forgery,中译是跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。

一般状况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,能够在受害者绝不知情的状况下以受害者名义伪造请求发送给受攻击服务器,从而在并未受权的状况下执行在权限保护之下的操做。

在用户已经登陆目标站的前提下,访问到了攻击者的钓鱼网站,攻击者直接经过 url 调用目标站的接口,伪造用户的行为进行攻击,一般这个行为用户是不知情的。

CSRF 攻击的防范

当前,对 CSRF 攻击的防范措施主要有以下几种方式。

验证码

验证码被认为是对抗 CSRF 攻击最简洁而有效的防护方法。

从上述示例中能够看出,CSRF 攻击每每是在用户不知情的状况下构造了网络请求。而验证码会强制用户必须与应用进行交互,才能完成最终请求。由于一般状况下,验证码可以很好地遏制 CSRF 攻击。

但验证码并非万能的,由于出于用户考虑,不能给网站全部的操做都加上验证码。所以,验证码只能做为防护 CSRF 的一种辅助手段,而不能做为最主要的解决方案。

Referer Check

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。经过 Referer Check,能够检查请求是否来自合法的"源"。

好比,若是用户要删除本身的帖子,那么先要登陆 www.c.com,而后找到对应的页面,发起删除帖子的请求。此时,Referer 的值是 www.c.com;当请求是从 www.a.com 发起时,Referer 的值是 www.a.com 了。所以,要防护 CSRF 攻击,只须要对于每个删帖请求验证其 Referer 值,若是是以 www.c.com 开头的域名,则说明该请求是来自网站本身的请求,是合法的。若是 Referer 是其余网站的话,则有多是 CSRF 攻击,能够拒绝该请求。

针对上文的例子,能够在服务端增长以下代码:

if (req.headers.referer !== 'http://www.c.com:8002/') {
    res.write('csrf 攻击');
    return;
}
复制代码

Referer Check 不只能防范 CSRF 攻击,另外一个应用场景是 "防止图片盗链"。

添加 token 验证

CSRF 攻击之因此可以成功,是由于攻击者能够彻底伪造用户的请求,该请求中全部的用户验证信息都是存在于 Cookie 中,所以攻击者能够在不知道这些验证信息的状况下直接利用用户本身的 Cookie 来经过安全验证。要抵御 CSRF,关键在于在请求中放入攻击者所不能伪造的信息,而且该信息不存在于 Cookie 之中。能够在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端创建一个拦截器来验证这个 token,若是请求中没有 token 或者 token 内容不正确,则认为多是 CSRF 攻击而拒绝该请求。

总结

本文主要介绍了 XSS 和 CSRF 的攻击原理和防护措施。固然,在 Web 安全领域,除了这两种常见的攻击方式,也存在这 SQL 注入等其它攻击方式,这不在本文的讨论范围以内,若是你对其感兴趣,能够阅读 SQL 注入技术专题的专栏详细了解相关信息。最后,总结一下 XSS 攻击和 CSRF 攻击的常见防护措施:

  1. 防护 XSS 攻击
    • HttpOnly 防止劫取 Cookie
    • 用户的输入检查
    • 服务端的输出检查
  2. 防护 CSRF 攻击
    • 验证码
    • Referer Check
    • Token 验证
相关文章
相关标签/搜索