csrf-token的解析

Posted 乐知鱼前端日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csrf-token的解析相关的知识,希望对你有一定的参考价值。





这是小鱼与您分享的

第4篇文章


csrf:关键是攻击方虽然获取不到cookie的信息,但是可以攻击请求接口的时候将cookie中信息通过浏览器带给服务器端。(cookie还无过期的情况下)


防御措施实战如下

1

referer

即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

    

2

token-cookie


登陆成功后,生成cookie,并且cookie中种植了token信息,当客户端请求的时候将cookie中的token获取到,并且通过header头自定义信息tk等自定义字段(并列cookie字段)传递给服务器端,服务器 将token字段与cookie中的token做比对是否相等;token是一个多位随机数。

   

3

token-session


第一次登陆成功后,服务器端生成token返回客户端,并且自己有特定的密钥存储,请求时客户端将token(msg,分隔符.,签名)发给服务器端。

为什么从别的攻击网站进来的同域名页面token获取不到?

理解错误,攻击者只是在他的页面进行了接口的访问请求,不会跳转到我们的页面。

1.Token构成。

从需求功能上来讲,为了防止CSRF工具,token需要具有不重复,另外,还含有特定的功能信息,比如过期时间戳。

下面的图描述了一个token的数据构成:

Token的数据结构。

----------------------------------------------------------------------------- |             msg                  |        separator       |           signature                    | ----------------------------------------------------------------------------- |     key     |   timestamp  |              .               |    Base64(sha256(msg))        | -----------------------------------------------------------------------------

token由三部分组成:a).msg b). separator c).signature。

a). msg部分:而msg本身也有两部分组成:一部分,随机字符的主体,另一部分是过期时间戳。

b). 分隔符号:用符号分隔msg部分,和加密后生成的signature签名部分,这里用的是”.“

c). 签名signature。

signature签名,是对上面提到的msg,按照msg中提到的msg的信息部分,按照特定的秘锁进行加密。

token = base64(msg)格式化..base64(sha256("秘锁", msg))

2.Token的加密。

首先,是按照合适得加密方法对数据进行加密。这里我们通用的就使用了sha256散列算法,然后进行BASE64的格式转换。然后,我们需要在token串中隐含过期时间的设定,从需求上讲,每条与服务器交互的token有是有过期时间的,超过这个时间范围,就无效了,需要重新从服务器中取得。

3.Token的验证。

当用户从客户端,得到了token,再次提交给服务器的时候,服务器需要判断token的有效性,否则不加判断直接处理数据,token的生成就无意义了。

验证的过程是:

a). token解包。

先把接受到的token,进行分解。“.”为分隔符,分为msg部分+signature签名部分。

b). 比对签名。

对msg部分进行base64解码, decode_base64(msg)然后在对解码后的msg明文,进行同样的encode_base64(sha256(msg))加密。秘锁相同,然后,判断加密后的数据和客户端传过来的token.signature的部分是否一致。如果一致,说明这个token是有效的。

c). 判断时间过期。如果是有效的,取出msg.timestamp,和当前系统时间进行比较,如果过期时间小于当前时间,那这个token是过期的,需要重新的取得token。



今天的分享就到这里,感谢您的关注!



·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧






以上是关于csrf-token的解析的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 将 csrf-token 发布到 Compoundjs

Angular 4 无法在标题中设置 CSRF-TOKEN

为 laravel SPA 生成动态 csrf-token

在 Spring Boot 中为 POST 传递 JSessionId 和 CSRF-Token

React js - Laravel 5:在 POST 方法中使用 csrf-token

小技巧 | Burpsuite爆破含CSRF-Token的程序