使用加密的 cookie 和会话存储来保护请求
Using encrypted cookies and a session store to secure requests
我最近注意到我正在咨询的一个应用程序正在使用未加密的 cookie。前端 (Angular) 经常使用以下提取用户 ID:
var user_id = JSON.parse($cookies.userdata).id;
我想一个讨厌的访问者可以不断地使用他们的浏览器来更改他们的 ID 并访问他们不应该访问的资源。这是一个巨大的危险信号,我需要一些帮助来支撑它。 This looks like a solid enough guide,但我还没有完全了解不同的部分。
如果我使用 Mozilla 的客户端会话,cookie 中到底存储了什么?有什么我想要的吗?我有 API 路由,例如 GET /api/v1/user/:user_id
到 return 关于用户的信息。如果 cookie 在浏览器上被加密,我将无法访问当前 user_id
并进行此 API 调用。我的行动计划是什么?为此 API 创建一个代理服务器端,它将首先解密 cookie,提取 user_id
,然后 然后 调用 GET /api/v1/user/:user_id
? API 路由受检查 req.isAuthenticated() === true
的函数保护,如果有帮助的话。
综上所述,session 在什么时候起作用?假设我将用户会话存储在 MongoDB 中。我们知道 cookie 只能存储 4kb,但如果这就够了呢?什么样的数据应该存储在cookie中,什么样的数据应该存储在用户会话中?
你的回答将大大有助于澄清一些对我来说有点像黑匣子的概念。
试着一次只做一件事,否则你会失去理智! :)
客户端可以随时更改客户端上的任何内容。没关系。服务器很重要。服务器必须安全地使用会话 cookie。阅读 OWASP.
会话 cookie 值不需要加密,它只需要很长且随机即可,因此速度很慢且难以猜测。但是,浏览器和服务器之间的连接应该是加密的(使用 HTTPS)。
如果客户端的 userId 为 4,并且可以成功地从 /foo/userId/5 请求数据,那么这很糟糕。但这与 cookie 无关,而与服务器上的 Access Control 有关。
Cookie 大小几乎无关紧要。您应根据需要在 cookie 中存储尽可能少的信息。将会话数据存储在会话中(网络服务器内存)。在数据库中存储长期数据。
What exactly is stored in the cookie if I use Mozilla's
client-session? Anything I want?
是 - 任何值都经过加密和验证,这意味着它们不能在客户端上被篡改。基本上,在存储任何敏感的客户端时,您希望数据是防篡改的,并且还可以选择保密。使用 HMAC over SHA-256 等散列算法对数据进行身份验证可防止篡改,但不会阻止最终用户查看值。同样使用 AES-128 等算法进行加密,甚至可以防止最终用户查看数据。
对于用户名,您可能只需要 完整性(即使其防篡改)。这将阻止您的用户更改它,但您的 user_id
调用仍然能够读取该值。目前尚不清楚 Mozilla 的客户端会话是否仅支持身份验证。我很想改用 JSON Web Tokens,确实如此。
Given the above, at what point does session come into play?
我会使用会话来存储根本不需要客户端的信息。正如您所说,cookie 有大小限制。会话对于大数据更有意义,因为在 每个 请求时将 cookie 值发送到服务器。如果您在 cookie 中设置了大量数据,对于那些使用大量 cookie 的用户,您的网站性能将会降低。
我最近注意到我正在咨询的一个应用程序正在使用未加密的 cookie。前端 (Angular) 经常使用以下提取用户 ID:
var user_id = JSON.parse($cookies.userdata).id;
我想一个讨厌的访问者可以不断地使用他们的浏览器来更改他们的 ID 并访问他们不应该访问的资源。这是一个巨大的危险信号,我需要一些帮助来支撑它。 This looks like a solid enough guide,但我还没有完全了解不同的部分。
如果我使用 Mozilla 的客户端会话,cookie 中到底存储了什么?有什么我想要的吗?我有 API 路由,例如
GET /api/v1/user/:user_id
到 return 关于用户的信息。如果 cookie 在浏览器上被加密,我将无法访问当前user_id
并进行此 API 调用。我的行动计划是什么?为此 API 创建一个代理服务器端,它将首先解密 cookie,提取user_id
,然后 然后 调用GET /api/v1/user/:user_id
? API 路由受检查req.isAuthenticated() === true
的函数保护,如果有帮助的话。综上所述,session 在什么时候起作用?假设我将用户会话存储在 MongoDB 中。我们知道 cookie 只能存储 4kb,但如果这就够了呢?什么样的数据应该存储在cookie中,什么样的数据应该存储在用户会话中?
你的回答将大大有助于澄清一些对我来说有点像黑匣子的概念。
试着一次只做一件事,否则你会失去理智! :)
客户端可以随时更改客户端上的任何内容。没关系。服务器很重要。服务器必须安全地使用会话 cookie。阅读 OWASP.
会话 cookie 值不需要加密,它只需要很长且随机即可,因此速度很慢且难以猜测。但是,浏览器和服务器之间的连接应该是加密的(使用 HTTPS)。
如果客户端的 userId 为 4,并且可以成功地从 /foo/userId/5 请求数据,那么这很糟糕。但这与 cookie 无关,而与服务器上的 Access Control 有关。
Cookie 大小几乎无关紧要。您应根据需要在 cookie 中存储尽可能少的信息。将会话数据存储在会话中(网络服务器内存)。在数据库中存储长期数据。
What exactly is stored in the cookie if I use Mozilla's client-session? Anything I want?
是 - 任何值都经过加密和验证,这意味着它们不能在客户端上被篡改。基本上,在存储任何敏感的客户端时,您希望数据是防篡改的,并且还可以选择保密。使用 HMAC over SHA-256 等散列算法对数据进行身份验证可防止篡改,但不会阻止最终用户查看值。同样使用 AES-128 等算法进行加密,甚至可以防止最终用户查看数据。
对于用户名,您可能只需要 完整性(即使其防篡改)。这将阻止您的用户更改它,但您的 user_id
调用仍然能够读取该值。目前尚不清楚 Mozilla 的客户端会话是否仅支持身份验证。我很想改用 JSON Web Tokens,确实如此。
Given the above, at what point does session come into play?
我会使用会话来存储根本不需要客户端的信息。正如您所说,cookie 有大小限制。会话对于大数据更有意义,因为在 每个 请求时将 cookie 值发送到服务器。如果您在 cookie 中设置了大量数据,对于那些使用大量 cookie 的用户,您的网站性能将会降低。