4

我正在编写一个支持用户登录的 ExpressJS 后端。从多个示例中,我看到了 req.session 对象的使用。似乎该对象用于跨服务器和客户端存储和检索信息,因此服务器可以设置“已登录”标志,然后检查此标志以查看用户是否已登录。

我的问题是,这究竟是如何工作的?服务器如何在客户端存储信息并从每个请求中检索信息,是通过 cookie 吗?客户端是否可以在客户端手动操作此对象的内容以破坏安全性?如果是,那么检查用户登录的更安全方法是什么?

4

3 回答 3

6

我从 ExpressJS Google 小组中找到了一些东西,因此 ExpressJS 中的会话和 cookie 有点不同。基本上:

Res.cookie 在响应中添加一个 cookie;req.session 是服务器端的键/值存储。默认情况下,会话数据位于服务器内存中,尽管您可以配置备用存储。

您可以在会话中存储您想要的任何内容。客户端看到的唯一内容是标识会话的 cookie。

(归功于劳里·哈珀

所以看起来 ExpressJS 已经在做@Vahid 提到的事情,将值存储在服务器上并将密钥保存为客户端的 cookie。据我了解, req.session 使用自己的 cookie(仅包含一个键),独立于 req.cookie 的自定义 cookie。

于 2013-01-28T16:22:03.270 回答
3

实际上 req.session 中的会话对象不是由客户端传递的。在您的语法中,您可能使用过app.use(session{options})

这是一个中间件。现在,从 express 服务器传递的每个请求都必须通过这个中间件。该中间件获取 cookie(只是存储在服务器上的 sessionId 的编码版本)并将其解码以获取 sessionId。从服务器获取与该 sessionId 对应的会话并作为 req.session 附加到 req 对象。它给人一种我们从客户端获取会话的感觉,但实际上是中间件通过从客户端获取 cookie 将会话对象附加到 req 对象的工作。

于 2015-06-30T06:51:57.853 回答
2

我不知道您的确切实施,所以我不专门针对您的情况发表评论。但通常你可以验证每个请求从浏览器发送到服务器的内容,你可以安装一个 firefox 扩展,如“Live HTTP Header”或“Tamper Data”,甚至是一个wireshark(如果不是https)或firebug、firecookie等。

然后检查通过 Cookie 发送的内容,我确信 ExpressJS 在成功验证用户身份后会生成会话 ID,将其存储在数据库中并将相同的值存储在浏览器 cookie 中。在每个请求(甚至图像)上,您的浏览器都会发送 cookie,服务器会使用 db 验证会话 ID 并检测您的会话。

我见过一些旧的不安全代码将用户的会话设置为login=1之类的值,如果是你的情况,你必须知道它真的很容易绕过。您必须为每个客户端生成、保存和设置会话 ID。

于 2013-01-25T18:06:31.290 回答