我正在开发一个oAuth2服务器,我偶然发现了这个问题。
让我们假设我的令牌设置为在一小时内到期。在此时间范围内,某些客户端使用相同的client_id
和相同的redirect_uri
进行了五十次隐式身份验证。一切都基本相同。
我应该在第一次请求中为后续版本生成相同的accessToken
,直到它过期,还是应该在每次请求时发出新的accessToken
?
发送相同令牌的好处是我不会在服务器上留下客户端的陈旧和未使用的令牌,从而最大限度地减少了攻击者试图猜测有效令牌的窗口。
我知道我应该限制速度而且我正在这样做,但是在数千台不同机器发生大型僵尸网络攻击的情况下,某些限制不会立即生效。
但是,我不确定这个解决方案的缺点,这就是我来到这里的原因。这是一个有效的解决方案吗?
答案 0 :(得分:4)
我宁愿说 - 不。
原因:
作为补充 - 通常通过应用程序逻辑防御僵尸网络攻击是非常困难的。将您的AS暴露给互联网的服务器应该注意这一点。在应用程序层,你应该注意它不会受到小带宽攻击的影响。
答案 1 :(得分:3)
如果它仍然有效,您可以返回相同的access_token
,对此没有任何问题。唯一的缺点可能在于您使用Implicit流,因此在URL片段中重复发送 - 相同的,有效的 - 访问令牌,该片段被认为不如使用例如授权码流程。
答案 2 :(得分:2)
作为一个拇指规则永远不会重复使用密钥,如果密钥捕获 ,这将为所设计的系统带来额外的安全性
答案 3 :(得分:1)
您可以在正确身份验证后发送其他 访问令牌,并在访问令牌上发送刷新令牌 >
一旦您的访问令牌 到期,您应该通知用户,用户应该重新请求提供一次性的新访问令牌 -use 刷新令牌以前提供给他们跳过重新身份验证的需要,你应该提供新的访问令牌和刷新令牌。
要使用假的刷新令牌来抵御攻击,您应该在几次警告后将它们与原始IP一起列入黑名单。
PS :永远不要使用可预测的令牌。通过使用完全随机的长字母数字字符串,Atleast使暴力攻击极为困难。如果您使用的是php,我会建议bin2hex(openssl_random_pseudo_bytes(512))
。