当前位置: 首页 > 知识库问答 >
问题:

如何防止使用被盗令牌进行 Rest Web 服务身份验证

聂和宜
2023-03-14

众所周知,Rest服务是无状态的,一般的身份验证策略是使用基于令牌的身份验证。

登录服务中,它接受返回令牌的凭证。

此令牌可以在客户端cookie中设置,所有后续请求都使用此令牌进行验证,并在令牌有效时处理新请求。

现在我的问题是如何验证令牌?如果有人窃取了令牌并试图通过编辑cookie来使用窃取的令牌访问其他服务,那么如何识别和限制它?

我们永远无法知道令牌是否由有效用户获取,并且同一用户正在尝试访问后续请求。但是,有哪些可能的方法可以使其更加困难,例如验证请求是否来自同一来源?

一个普遍的建议是为令牌/cookie设置老化,但是在令牌/cookie老化之前仍然没有帮助。

任何建议将不胜感激。

共有3个答案

孟胤
2023-03-14

经过各种方法的挣扎,我们找到了一个解决方案,解释如下:

  1. 我们在登录请求时将令牌(加密)存储在cookie中,对于每个后续请求,该cookie都会得到验证
  2. 问题是如果有人用另一个有效的令牌替换cookie中的令牌,因为cookie由客户端浏览器维护

解决方案:-

所以为了解决这个问题,我们添加了另一个cookie,它是多个值的组合。

例如

饼干1-

饼干 2 -

因此,在Cookie 1的情况下,很容易用另一个加密值替换,因为尽管它是加密的,但它只代表一个令牌。

但是在 Cookie 2 的情况下,它包含具有多个值的对象,因此只能在同一 cookie 中修改、加密和设置令牌值。

在身份验证之前,我们正在解密整个cookie 2,从中获取令牌部分,并根据cookie 1验证令牌部分。

这解决了我们的问题!!

感谢您的时间和指导。

万俟沛
2023-03-14

我目前对浏览器中授权请求的“最安全”方法的理解是,需要同时验证HttpOnly SameSite cookie和HTTP标头(例如AuthorizationX-CSRF-Token)。

例如,向浏览器发出 JWT 时,在 HttpOnly SameSite cookie 中发送 JWT 签名,并将正文(无签名)发送到客户端以存储在 localStorage 中并在授权标头中提交。授权请求时,将两者合并回完整的 JWT 中,然后照常验证。

或者,您可以生成两个带有字段的 JWT 来区分它们(例如,客户端中有“浏览器”,cookie 有“cookie”),并要求两者都有效并且都标识同一用户。一个在授权标头中发送并存储在localStorage中,另一个使用SameSite HttpOnly cookie。

另一种流行的html" target="_blank">方法是将 CSRF 令牌存储在 JWT 的字段中,并将 JWT 放入 cookie 中,并要求客户端在标头中发送匹配的令牌(例如 X-CSRF-Token)。

所有解决方案都有效地防止了XSS和CSRF攻击:XSS无法检索HttpOnly cookie,CSRF不包含HTTP标头,因此可以阻止这两种攻击。

请注意,您可能只想将此规则应用于来自 Web 浏览器的请求。对于服务器到服务器的通信,请求不受 CSRF 和 XSS 攻击。

程修雅
2023-03-14

我不相信有任何100%傻瓜证明的方法来防止使用被盗的用户令牌进行访问。你怎么知道令牌一开始就被盗了?但在我的脑海中,您可能需要考虑以下内容:

  1. 使用相同的令牌但使用不同的用户代理访问REST服务是可疑的。这可以通过用户代理标头的值来识别。您可能需要考虑放弃此类请求
  2. 如果IP地址发生了变化,但令牌仍然相同,该怎么办?嗯,也许有人在使用负载平衡器,并通过不同的IP地址访问网络?或者他使用与之前相同的令牌/cookie访问VPN?如果您不后悔放弃这样的请求,您可以通过检查源IP地址来提高安全性
  3. 如果是JWT代币,您需要一些基础设施来处理黑名单。遵循此步骤
 类似资料:
  • 我在做一个全堆栈的web应用程序。我的前端由angular-cli组成,后端由node+Express构建。

  • 场景是:您有一个有效期较长的刷新令牌和一个有效期限较短的访问令牌。 设置:有一个客户端、应用程序服务器和身份验证服务器。 客户端存储访问令牌。 应用程序服务器存储刷新令牌。 身份验证服务器分发刷新访问令牌。 其中一个优点是被盗的访问令牌只能在其有效的时间内使用。 假设黑客窃取了有效期为30分钟的访问令牌。当黑客在30分钟后用有效但过期的被盗访问令牌发出请求时,应用服务器用刷新令牌刷新它,从而黑客获

  • 本文向大家介绍如何防止cookie被盗用?相关面试题,主要包含被问及如何防止cookie被盗用?时的应答技巧和注意事项,需要的朋友参考一下 禁止第三方网站带cookie(same-site属性) 每次请求需要输入图形验证码 使用Token验证 为cookie设置HttpOnly 设置CSP 使用Referer验证 禁止网页内嵌 使用https cookie带上用户ip加密

  • 致命:“https://github.com/scuzzlebuzzle/ol3-1.git/'”身份验证失败

  • 问题内容: 在使用Java EE 6的Web应用程序上,我想将某些功能作为Json Rest Service公开。我想使用身份验证令牌进行登录,用户将发送其用户名,密码,服务器将发送回令牌,该令牌将用于授权用户在给定时间内的进一步请求。 到目前为止,有几个问题困扰着我; 当服务器创建令牌并将其发送给客户端时,服务器是否应该使用像哈希表这样的东西作为用户ID令牌对将其保存在DB或Bean中? 我可以

  • GoogleCredential凭证=newGoogleCredential.Builder(). setTransfer(TRANSPORT). setJsonFactory(JSON_FACTORY). setServiceAccount tId("SOMETHING@developer.gserviceaccount.com"). setServiceAccount tScopes(Bigq