【问题标题】:Using encrypted cookies and a session store to secure requests使用加密的 cookie 和会话存储来保护请求
【发布时间】:2015-09-16 05:47:57
【问题描述】:

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

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

我想一个讨厌的访问者可能会不断地使用他们的浏览器来更改他们的 ID 并访问他们不应该访问的资源。这是一个巨大的危险信号,我可以使用一些帮助来支撑它。 This looks like a solid enough guide,但我还没有完全理解不同的部分。

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

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

您的回答将大大有助于澄清一些对我来说有点黑匣子的概念。

【问题讨论】:

    标签: node.js security session cookies express


    【解决方案1】:

    如果我使用 Mozilla 的 客户会话?有什么想要的吗?

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 2015-06-12
      • 2016-10-30
      • 2014-10-06
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多