详解WEB进攻之CSRF进攻与防护(2)

这种要领的显而易见的长处就是简朴易行,网站的普通开拓人员不需要劳神 CSRF 的裂痕,只需要在最后给所有安详敏感的请求统一增加一个拦截器来查抄 Referer 的值就可以。出格是对付当前现有的系统,不需要改变当前系统的任何已有代码和逻辑。

然而,这种要领并非万无一失。Referer 的值是由欣赏器提供的,固然 HTTP 协议上有明晰的要求,可是每个欣赏器对付 Referer 的详细实现大概有不同,并不能担保欣赏器自身没有安详裂痕。利用验证 Referer 值的要领,就是把安详性都依赖于第三方(即欣赏器)来保障,从理论上来讲,这样并不安详。事实上,对付某些欣赏器,好比 IE6 或 FF2,今朝已经有一些要领可以改动 Referer 值。假如 网站支持 IE6 欣赏器,黑客完全可以把用户欣赏器的 Referer 值设为以 域名开头的地点,这样就可以通过验证,从而举办 CSRF 进攻。

即即是利用最新的欣赏器,黑客无法改动 Referer 值,这种要领仍然有问题。因为 Referer 值会记录下用户的会见来历,有些用户认为这样会加害到他们本身的隐私权,出格是有些组织担忧 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户本身可以配置欣赏器使其在发送请求时不再提供 Referer。当他们正常会见银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 进攻,拒绝正当用户的会见。

别的,假如Referer的判定逻辑写的不严密的话,也容易被攻破,譬喻

const referer = request.headers.referer; if (referer.indexOf('www.bank.example') > -1) { // pass }

假如黑客的网站是,则referer查抄无效。

2、在请求地点中添加 token 并验证

CSRF 进攻之所以可以或许乐成,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的环境下直接操浸染户的 cookie 来通过安详验证。要抵制 CSRF,要害在于在请求中放入黑客所不能伪造的信息,而且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式插手一个随机发生的 token,并在处事器端成立一个拦截器来验证这个 token,假如请求中没有 token 可能 token 内容不正确,则认为大概是 CSRF 进攻而拒绝该请求。

这种要领要比查抄 Referer 要安详一些,token 可以在用户登岸后发生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 举办比对,但这种要领的难点在于如何把 token 以参数的形式插手请求。对付 GET 请求,token 将附在请求地点之后,这样 URL 就酿成

而对付 POST 请求来说,要在 form 的最后加上

<input type="hidden" value="tokenvalue"/>

该要领有一个缺点是难以担保 token 自己的安详。出格是在一些论坛之类支持用户本身颁发内容的网站,黑客可以在上面宣布本身小我私家网站的地点。由于系统也会在这个地点后头加上 token,黑客可以在本身的网站上获得这个 token,并顿时就可以动员 CSRF 进攻。为了制止这一点,系统可以在添加 token 的时候增加一个判定,假如这个链接是链到本身本站的,就在后头添加 token,假如是通向外网则不加。不外,纵然这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来获得这个 token 值以动员 CSRF 进攻。这也是一些用户喜欢手动封锁欣赏器 Referer 成果的原因。

3、在 HTTP 头中自界说属性并验证

这种要领也是利用 token 并举办验证,和上一种要领差异的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自界说的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入个中。这样办理了上种要领在请求中插手 token 的未便,同时,通过 XMLHttpRequest 请求的地点不会被记录到欣赏器的地点栏,也不消担忧 token 会透过 Referer 泄露到其他网站中去。

然而这种要领的范围性很是大。XMLHttpRequest 请求凡是用于 Ajax 要领中对付页面局部的异步刷新,并非所有的请求都适适用这个类来提倡,并且通过该类请求获得的页面不能被欣赏器所记录下,从而举办前进,退却,刷新,保藏等操纵,给用户带来未便。别的,对付没有举办 CSRF 防护的遗留系统来说,要回收这种要领来举办防护,要把所有请求都改为 XMLHttpRequest 请求,这样险些是要重写整个网站,这价钱无疑是不能接管的。

4、Chrome欣赏器端启用SameSite cookie

下面先容如何启用SameSite cookie的配置,很简朴。

原本的 Cookie 的 header 配置是长这样:

Set-Cookie: session_id=esadfas325

需要在尾部增加 SameSite 就好:

Set-Cookie: session_id=esdfas32e5; SameSite

SameSite 有两种模式,Lax跟Strict模式,默认启用Strict模式,可以本身指定模式:

Set-Cookie: session_id=esdfas32e5; SameSite=StrictSet-Cookie: foo=bar; SameSite=Lax

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9110.html