使用加密的cookie和会话存储来保护请求

时间:2015-06-29 16:47:44

标签: node.js security session cookies express

我最近注意到我正在咨询的应用程序正在使用未加密的cookie。前端(Angular)经常使用以下内容来提取用户ID:

var user_id = JSON.parse($cookies.userdata).id;

我想一个讨厌的访问者可以继续使用他们的浏览器来改变他们的身份和访问他们不应该的资源。这是一个巨大的红旗,我可以使用一些帮助来支撑这一点。 This looks like a solid enough guide,但我并没有完全围绕着不同的部分。

  1. 如果我使用Mozilla的客户端会话,那么cookie中究竟存储了什么?我想要的任何东西?我有API路由,例如GET /api/v1/user/:user_id,以返回有关用户的信息。如果Cookie在浏览器上加密,我将无法访问当前user_id并进行此API调用。我的行动计划是什么?为此API创建一个代理服务器端,首先解密cookie,提取user_id然后调用GET /api/v1/user/:user_id? API路由由检查为req.isAuthenticated() === true的函数保护,如果这有帮助的话。

  2. 鉴于上述情况,会话在什么时候发挥作用?假设我在MongoDB中存储用户会话。我们知道cookie只能存储4kb,但如果这足够了怎么办? 应该存储在cookie中的哪种数据以及应该在用户的会话中存储哪种数据?

  3. 你的答案会在很长一段时间内清除一些对我来说有点黑盒子的概念。

2 个答案:

答案 0 :(得分:2)

尝试一次做一件事,否则你会失去理智! :)

客户端总是可以在客户端上更改他们想要的任何内容。这没关系。服务器很重要。服务器必须安全地使用会话cookie。阅读OWASP

会话cookie值不需要加密,只需要很长且随机,所以它很慢而且难以猜测。但是,应加密浏览器和服务器之间的连接(使用HTTPS)。

如果客户端有userId 4,并且可以从/ foo / userId / 5成功请求数据,那么这很糟糕。但这与cookie和服务器上Access Control的所有内容无关。

Cookie大小几乎无关紧要。您应该根据需要在cookie中存储尽可能少的信息。将会话数据存储在会话中(Web服务器内存)。将长期数据存储在数据库中。

答案 1 :(得分:2)

  

如果我使用Mozilla,那么确切地存储在cookie中   客户端会话?我想要的任何东西?

是 - 任何值都经过加密和验证,这意味着它们无法在客户端上被篡改。基本上,当存储任何敏感的客户端时,您希望数据是防篡改的,并且可选地也是保密的。使用哈希算法(如SHA-256上的HMAC)对数据进行身份验证可防止篡改,但不会阻止最终用户查看该值。使用AES-128等算法进行加密也可以防止最终用户查看数据。

对于用户名,您可能只需要完整性(即使其防篡改)。这会阻止您的用户更改它,但您的user_id调用仍然可以读取该值。目前尚不清楚Mozilla的客户端会话是否仅支持身份验证。我很想使用JSON Web Tokens来代替,

  

鉴于上述情况,会议在什么时候发挥作用?

我会使用会话来存储根本不需要客户端的信息。正如你所说,cookie有一个大小限制。会话对大数据更有意义,因为cookie值会在每个请求上发送到服务器。如果您在Cookie中设置了大量数据,那么对于拥有大量Cookie的用户,您将降低网站的性能。