可以看到,当登任命户会见进攻者的网站时,会向 提倡一个删除用户帖子的请求。此时若用户在切换到 的帖子页面刷新,会发明ID 为 87343 的帖子已经被删除。
由于 Cookie 中包括了用户的认证信息,当用户会见进攻者筹备的进攻情况时,进攻者就可以对处事器提倡 CSRF 进攻。在这个进攻进程中,进攻者借助受害者的 Cookie 骗取处事器的信任,但并不能拿到 Cookie,也看不到 Cookie 的内容。而对付处事器返回的功效,由于欣赏器同源计策的限制,进攻者也无法举办理会。因此,进攻者无法从返回的功效中获得任何对象,他所能做的就是给处事器发送请求,以执行请求中所描写的呼吁,在处事器端直接改变数据的值,而非窃取处事器中的数据。
但若 CSRF 进攻的方针并不需要利用 Cookie,则也不必记挂欣赏器的 Cookie 计策了。
4.CSRF 进攻的防御
当前,对 CSRF 进攻的防御法子主要有如下几种方法。
4.1 验证码
验证码被认为是反抗 CSRF 进攻最简捷而有效的防止要领。
从上述示例中可以看出,CSRF 进攻往往是在用户不知情的环境下结构了网络请求。而验证码会强制用户必需与应用举办交互,才气完成最终请求。因为凡是环境下,验证码可以或许很好地截止 CSRF 进攻。
但验证码并不是万能的,因为出于用户思量,不能给网站所有的操纵都加上验证码。因此,验证码只能作为防止 CSRF 的一种帮助手段,而不能作为最主要的办理方案。
4.2 Referer Check
按照 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来历地点。通过 Referer Check,可以查抄请求是否来自正当的”源”。
好比,假如用户要删除本身的帖子,那么先要登录 ,然后找到对应的页面,提倡删除帖子的请求。此时,Referer 的值是 ;当请求是从 提倡时,Referer 的值是 了。因此,要防止 CSRF 进攻,只需要对付每一个删帖请求验证其 Referer 值,假如是以 开头的域名,则说明该请求是来自网站本身的请求,是正当的。假如 Referer 是其他网站的话,则有大概是 CSRF 进攻,可以拒绝该请求。
针对上文的例子,可以在处事端增加如下代码:
if (req.headers.referer !== 'http://www.c.com:8002/') { res.write('csrf 进攻'); return; }
Referer Check 不只能防御 CSRF 进攻,另一个应用场景是 “防备图片盗链”。
4.3 添加 token 验证(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进攻