【问题标题】:How can I ensure an http request comes from specific user?如何确保 http 请求来自特定用户?
【发布时间】:2023-05-04 01:26:01
【问题描述】:

我正在为网站编写一项附加服务,该服务利用现有的登录行为,同时需要用户提供一些额外的注册详细信息。新服务在不同的子域中运行。

用户将能够在我的数据网络应用程序上创建资源,这些资源必须针对该用户的数据集合进行保存。

我希望这个用户标识符将在 http 请求的正文中传递给 webapp。但是,我担心恶意攻击可能会重写正文中的用户名,使请求看起来像是来自另一个用户。

我能做些什么来使这更安全? (这算不算 CSRF 攻击?)

新服务是用 Java 编写的,带有 Spring 3。

【问题讨论】:

  • 当您说 Spring 3 时,您还指 Spring Security 吗?
  • 不,所有当前的安全性都由主应用程序处理,我们无权访问它,除了检索当前的用户 guid 和名称。

标签: java web-services rest security


【解决方案1】:

您永远无法确保 http 请求来自特定用户,您只能尝试验证用户和请求。通常这是通过在登录或身份验证过程中创建票证来完成的,然后在后续请求中要求该票证。然后,您可以将票证与用户匹配并接受它为有效。票证在一段时间不活动后过期,需要用户重新登录。

【讨论】:

  • 谢谢,这就是我想做的——如果没有魔法的话。
  • 除了不活动时间之外,添加绝对会话时间将使其更安全。例如,20 分钟不活动或 4 小时绝对和重新验证并生成新票。
  • 虽然您不能信任 IP 地址和推荐人主机信息(两者都可能被欺骗),但如果您获得的 IP/推荐人与预期不同,您可以(并且应该)要求重新授权,因为可能有问题.
【解决方案2】:

如果可能,您应该通过主网站使用的相同安全堆栈传递请求。

如果不可能,我会使用 Spring Security 来处理身份验证。我不确定 Spring Security 已经存在哪些插件来验证这样的服务请求,但你总是可以要求会话使用 cookie,然后这只是客户端处理身份验证步骤的问题。

因此,您可以使用“普通”表单登录,也可以将令牌请求设置放在一起,但这涉及更多。

【讨论】: