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 安全相关的知识。