【问题标题】:Cookie and security in Java (GAE)Java 中的 Cookie 和安全性 (GAE)
【发布时间】:2012-03-01 00:41:38
【问题描述】:

现在,在我的应用程序中,用户的 cookie 以包含用户 ID 的特定格式生成。我希望我的 cookie 在每次登录后随机生成,这样即使 cookie 被盗一次,黑客也永远不会永远使用它们。

以这种方式处理 cookie 的最佳做法是什么?我应该如何存储/检索它们(哈希表/数据存储...)?

谢谢

【问题讨论】:

  • 为什么不使用标准的东西,比如 Spring Security?
  • 我对Spring还不熟悉,这次想自己写

标签: java google-app-engine cookies session-cookies httpcookie


【解决方案1】:

我同意 Rick 的观点,容器设计人员已经完成了验证请求是否来自同一用户的繁琐工作,您不想重新发明轮子吗?

HttpSession session = request.getSession(); 

这将创建一个新会话,如果一个不存在,但如果它存在,它将为您提供现有会话。

session.setAttribute('key', value);

value 可以是任何可序列化的 POJO,key 是一个字符串。 您可以通过以下代码在您的应用程序范围内检索存储的值。

Object value = (Object) session.getAttribute('key');

有关如何使用会话的更多信息,请查看 HttpSessions 的 Java 规范。

【讨论】:

  • 我的应用在 GoogleAppEngine 上运行,并且我处理多个 JVM。反过来,会话信息的范围仅限于当前的 Web 应用程序 (ServletContext)。每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文。
  • 在 AppEngine 中,会话由数据存储区支持,因此它们在请求之间是持久的,即使用户在请求之间点击不同的实例。
  • 带有“最终一致性”的警告。这是我试图在没有太多运气的情况下创建的应用程序中解决的问题。如果您创建了会话,然后用户立即切换到另一个没有会话的实例(还),您会怎么做?
  • 用户如何切换实例?
【解决方案2】:

您可以尝试以下参数:

  • 用户名
  • 生存时间(毫秒)
  • 散列:
    • 用户密码
    • 用户名
    • 远程 IP 或浏览器
    • 生存时间(与以前完全相同)
    • 可能还有预定义的字符串或盐

将其连接成一个字符串(如13413:1826271762:b026324c6904b2a9cb4b88d6d61c81d1)并将其存储到一个cookie 中,如USERID

根据您需要的每个请求:

  • 检查指定时间是否有效(小于当前时间)
  • 从数据库中加载用户,按指定 ID
  • 验证哈希签名(针对当前远程 IP/浏览器和当前密码)

【讨论】:

  • 感谢您的回复。问题是,如果 cookie 是预定义的(根本不是随机的),黑客就能够窃取它一次以在将来使用它。如果我将随机字符串添加到 cookie 的值并使用 key=userID 将其存储在 datastore/memcache 中并在注销后将其清除怎么办?
【解决方案3】:

我建议使用 GAE/J 支持的内置 Java 会话对象 HttpSessionLook here 获取有关如何在 GAE 上启用会话的文档。

您可以将会话设置为在某个时间段后过期,或者您可以在其中存储一个数字并在外部验证会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2014-07-16
    • 2011-01-29
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多