【问题标题】:Not cookie based session management in node.jsnode.js 中不是基于 cookie 的会话管理
【发布时间】:2013-05-06 06:01:18
【问题描述】:

我正在 node.js 中寻找基于非 cookie 的会话管理,例如在 URL 中传递参数,如 &session_id=。当请求带有 session_id 时,它将知道会话已过期。我查看了 connect 库,但它看起来只是基于 cookie。

【问题讨论】:

  • 我从来没有遇到过这样的模块。它的存在也值得怀疑,因为它也需要模板引擎的支持(将会话 ID 注入每个链接)。所以我认为你必须自己实现它。

标签: node.js session


【解决方案1】:

警告

session id 作为 GET 参数传递被认为是不好的做法。为什么?这很危险,因为人们通常不关心session id,他们可能会发布/共享带有会话 ID 的链接。

这也是一个问题,因为当用户单击您网站上的外部链接并转到另一个站点时,该新站点将能够在引荐来源链接中看到 session_id

所以我认为这不是一个好主意。 Cookie 更安全。

看看:Session Hijacking

【讨论】:

  • 这不适用于公共网站。并且客户端不一定启用cookie。无论如何,你的警告是有道理的。
【解决方案2】:

对于您收到的每个请求,您都会相应地获得所有客户端 cookie。 您还可以使用“Set-Cookie”在响应 HTTP 标头中设置客户端 cookie。

使用 GET 参数是不安全的。任何用户都可能意外共享他们的会话 ID,但如果您想要 100% 的安全性,我会通过 cookie 共享会话 ID,并且我会使用 HTTPS 来防止窥探者窃取 cookie。

【讨论】:

    【解决方案3】:

    您可以使用localstoragesessionStorage..

    • 几乎和cookie一样
    • 不是 cookie
    • 比饼干好!

    更多信息:https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage

    它非常-非常-易于使用...例如在 Js 中:

    <script>
        // check if Storage is avaible
      if(typeof(Storage)!=="undefined") {
        // Save data to local storage (no exiparion date)
        localStorage.setItem("name_always", "bxx");
        // Save data to the current session (removes when the tab is closed)
        sessionStorage.setItem("name_now", "bxx");
      } else {
        // No Storage support...
      }
      // Access to stored data
      alert( "For only now, my name is: " + sessionStorage.getItem("name_now"));
      alert( "Every day, my name is: " + localStorage.getItem("name_always"));
    </script>
    

    标签:

    【讨论】:

      【解决方案4】:

      您可以将会话与 node.js 中的存储一起使用。例如,您有快速应用程序并希望在您的 web 应用程序中使用类似会话的系统。您可以为此使用connect-mongo 模块。这将让您将会话存储在 db 中。在你的 app.js 中

      var express = require('express'),
          , mongoStore = require('connect-mongo')(express);
      
      var app = express();
      
      app.configure('all', function () {
          app.use(express.session({
              secret: "terces",
              cookie: { maxAge: 24 * 60 * 60 * 1000 },
              store: new mongoStore({
                  url: your_db_url
              })
          }));
          app.use(function(req, res, next) {
              res.locals.session = req.session;
              next();
          });
      });
      

      使用上面的基本代码,您可以在 express 中使用会话,您可以直接在控制器和视图中使用它。在您的控制器中;

      app.post('/blog/create/?', function(req, res, next) {
          if (!req.session.user) {
              next("You need to login in order to create blog!");
          }
      });
      

      在您看来,例如,您可以使用session.user 来生成配置文件菜单。

      【讨论】:

        猜你喜欢
        • 2012-02-09
        • 2014-08-05
        • 2021-04-15
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        相关资源
        最近更新 更多