XSS-and-CSRF

今天我们来了解一下常见的 2 种网站安全攻击—— XSS 和CSRF。

什么是XSS

XSS(cross site scripting),意思是跨站点脚本,是一种攻击者在另一个用户的浏览器中执行恶意脚本的攻击方式。
攻击者并不直接锁定攻击者,而是利用一个用户可能会访问的存在漏洞的网站,通过这个网站间接地进行攻击。对于浏览器而言,攻击者注入的脚本看上去就是正常网站的一部分。那到底什么样的脚本是恶意脚本?

我们知道,在浏览器中JS 的执行环境受到严格限制,而且只有有限的权限去访问用户的文件和操作系统,比如我们随便在浏览器的控制台输入一段脚本,几乎不能造成什么伤害。但是,JS 的以下特性却可以造成较大伤害:

  • JS 有权访问一些用户的敏感信息,比如 cookie
  • JS 能够通过 XHRHttpRequest 发送带有任何内容的 HTTP 请求到任何地址
  • JS 能够通过操作 DOM 修改当前页面上的 HTML

那么,攻击者怎么通过这些特性发起攻击呢?举个例子,很多网站都可以「记住你的用户名和密码」或者「自动登录」,其实就是在本地设置了一个 cookie,让我们免去了每次都输入用户名和密码的痛苦,但是攻击者完全可以通过document.cookie这么简单的代码 就获取到用户的 cookie,攻击者就可以登录我们的账号做任何他想做的事情。或者以论坛为例,如果论坛后台没有进行预防措施,攻击者在发帖的时候输入了恶意的脚本,当发帖成功,任何人访问这个帖子都会执行这个恶意脚本。

什么是CSRF

CSRF(cross site request forgery),意思是跨站请求伪造,也就是攻击者盗用我们的登陆信息,以我们的身份发送各种请求。上面说了,在网站中注入恶意脚本可以发送带有任何内容的HTPP请求到任何地址,所以我们可以说,XSS 和 CSRF 的区别就是:CSRF 是 XSS 的一种实现方式。

预防

针对 XSS 攻击,客户端主要可以从两个方面预防:输入和输出。

  • 在攻击者通过表单等输入想往数据库里存入恶意脚本的时候,客户端可以用一套规则去过滤掉恶意脚本,只留下限定的输入。这种做法有一个弊端就是如果添加新功能,通常就得去更新用来过滤恶意脚本的规则;
  • 在客户端输出内容时,对之前存到数据库的内容进行过滤,将非正常的内容过滤掉,让不让其输出到页面上,这样攻击者注入的恶意脚本也就没有执行的机会

针对 CSRF,客户端可以从以下几个方面预防:

  • 限定对数据库内容进行增、删、改的操作请求必须是 post 请求
  • 检验 Referrer,阻止安全域名之外的网站发起的请求
  • 生成一个随机数 token,每次请求的时候带上这个 token,客户端收到请求之后检测 token 的正确性
  • 每个请求都使用验证码,这个方法可以很完美的阻止恶意请求,但是每次都要输入验证码的使用体验不是很好

总的来说,对于 XSS 和 CSRF 攻击我们前端能做的比较少,最安全的做法就是客户端从上述几个方面进行处理,但是我们依然很有必要了解这些 web 安全相关的知识。

参考