1

我刚刚读到 Play 将会话数据保存在客户端:

重要的是要了解 Session 和 Flash 数据不存储在服务器中,而是使用 Cookie 添加到每个后续 HTTP 请求中。这意味着数据大小非常有限(最多 4 KB)并且您只能存储字符串值。

我对WEB没有经验,所以我有几个问题:

1) 安全吗?

2)在这种会话中存储敏感数据的合理性如何?

客户端可以更改请求数据(更改没有会话 ID 的会话数据)。Play 中是否有任何内置机制来防止此类情况的影响?当客户端更改会话数据,请求服务器尝试读取此数据后,会发生什么?

Cookie 使用密钥签名,因此客户端无法修改 cookie 数据(否则将失效)。

但这意味着什么?假设客户端更改会话数据。之后服务器端发生了什么:

String foo = session(bar)

foo 将为空?垃圾随机字符串?会抛出异常吗?

4

1 回答 1

4

这种“RESTful”的会话方法足够安全。有更安全和更快的方法来管理会话的问题。

cookie 可能未签名。为此使用非对称加密将是一种巨大的资源浪费。cookie 更有可能受到散列消息身份验证代码或 HMAC 的保护。如果开发人员认为 HMAC 被称为“签名”,那么您可能会遇到更大的安全问题,因为该词的使用显然是不正确的。

使用 HMAC 作为会话 ID 的最大安全问题是,您很可能使用单个密钥构建所有会话。如果需要,可以在数年内使用一组机器强制将此密钥强制离线。确保你的秘密很大,至少大约 1,024 字节。如果可以使用目录遍历或其他攻击从文件中读取此密钥,则攻击者可以自由地建立自己的会话状态,这可能导致完全妥协。

最安全的会话 ID 是一个很大的随机值,大概 32 个字节就足够了。此数字用于从数据库中提取会话状态。最好来自托管在本地网络上的非常快速的非关系数据库,例如 memcached。

从性能的角度来看,HMAC 会话方法是不可取的,因为它会为每个 HTTP 请求消耗额外的带宽……因此会减慢每个 http 请求并消耗客户端资源和 Web 服务器的带宽。

您应该只传输满足请求所需的最小值。复杂性是安全的大敌,大的随机值很简单。

于 2013-01-10T17:30:19.170 回答