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
在 Spring Boot 中为 POST 传递 JSessionId 和 CSRF-Token