@
bigbigeggs 我做安全的不是专业开发本不想跟你扯这么多,既然你回我了,那就跟你友好探讨一下,首先我认为 token 应该是服务端生成告诉客户端的,客户端怎么会知道你是用什么参数生成的呢?客户端只需要请求的时候带上即可。即攻击者获得了 url ,例如 del?id=1&token=xxx ,攻击者不知道这个用户现在有效的 token ,这个请求到服务器经过校验是无效的啊,为什么不能防止重放呢?
其次,讨论的重点是重放,什么场景会有重放?重放有可能是想针对客户的攻击,例如我把嗅探到的其他用户转账的请求包重放;也可能是针对服务端的攻击,例如我把点赞重放来刷票,甚至也可能是用户觉得页面有点卡他又刷新了一下,你总不能说我在付款页面刷新一下你又扣了一遍款吧?重放不需要考虑你是怎么生成的,我只管把数据包重新发送就行,构造恶意的请求那是另一个范畴了。你可能把重放和 csrf 两个东西搞混了?
反而我认为你还被其他人误导了,中间人和重放不是完全划等号的,逻辑应该是存在中间人攻击的话会出现在重放这个问题,因为我可以获取到你的数据包,但重放也不只在中间人攻击中存在,所以 token 防止不了 mitm ,只能用来解决重放。你想想我都能获取到你往来的请求了,你下一个 token 我也知道是什么,我完全可以构造一个请求带上服务端给你返回的有效 token 。但是我重放你请求的包是没用的,使用 https 才是可以解决 mitm 的方案,之一,https 也并不完全安全,尤其是支持一些老版本的 tls 。
所以我才说你连 token 都没搞明白,因为我从你的描述中感觉你只知道 token 应该怎么生成,但你不知道怎么用,也不知道为什么要用