【问题标题】:NodeJS sessions, cookies and mysqlNodeJS 会话、cookie 和 mysql
【发布时间】:2013-02-21 19:26:06
【问题描述】:

我正在尝试构建一个身份验证系统并且我有 app.js

var express = require('express')
  , MemoryStore = require('express').session.MemoryStore
  , app = express();

app.use(express.cookieParser());
app.use(express.session({ secret: 'keyboard cat', store: new MemoryStore({ reapInterval: 60000 * 10 })}));
app.use(app.router);

和 route.index 一样

var express = require('express')
  , mysql = require('mysql')
  , crypto = require('crypto')
  , app = module.exports = express();

app.get('/*',function(req,res){
    var url = req.url.split('/');
    if (url[1] == 'favicon.ico')
        return;

    if (!req.session.user) {
        if (url.length == 4 && url[1] == 'login') {     
            var connection = mysql.createConnection({
                host     : 'localhost',
                user     : 'user',
                password : 'pass',
            });
            var result = null;
            connection.connect();
            connection.query('use database');
            var word = url[3];
            var password = crypto.createHash('md5').update(word).digest("hex");
            connection.query('SELECT id,level FROM users WHERE email = "'+url[2]+'" AND password = "'+password+'"', function(err, rows, fields) {
              if (err) throw err;
                for (i in rows) {
                    result = rows[i].level;
                }
                req.session.user = result;
            });
            connection.end();
        }
    }

console.log(req.session.user)

当我第一次访问 http://mydomain.com/login/user/pass 时,它会显示在最后一次控制台调用中,但第二次访问时 cookie 是干净的

【问题讨论】:

  • 在你做任何事情之前,请阅读proper SQL escaping。你在这里做的事情是非常危险的。您不能将任意用户提供的数据插入到查询字符串中。您应该始终使用安全的占位符,例如 ? 来表示转义的内容。
  • 是的,在了解 cookie 和会话的工作原理后,我将设法防止 sql 注入,但现在我专注于了解会话和 cookie。谢谢链接。
  • 我只是希望你在弄明白之前不要将这段代码推广到公共互联网上。

标签: mysql node.js session


【解决方案1】:

您需要将 cookie 值保存在 response 对象中:

res.cookie('session', 'user', result);

http://expressjs.com/api.html#res.cookie

【讨论】:

  • Hector 我用你的替换了那行,现在给我这个错误:错误:发送后无法设置标题。
  • 你可能已经有问题是 res.send()。设置 cookie 的调用应该在该调用之前。如果我是你,我会创建一个较小版本的代码来理解 cookie 和 Express,然后混合数据库访问。
  • 我在导致该错误的 mysql 结果之外有一个 res.end() 但即使我将 mysql 结果放入第二次访问中的 cookie 仍然是空的。 { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true } }
【解决方案2】:

为什么不直接使用 Express 的会话处理?如果您将 express 命令行工具用作express --sessions,它将创建具有会话支持的项目模板。从那里您可以将会话行复制到您当前的项目中。 How do sessions work in Express.js with Node.js? 中有更多信息(这看起来可能是重复的)

至于清理您的 SQL,您似乎正在使用该库,如果您使用参数化查询(即 ? 占位符),它将为您清理您的输入。

最后,您使用 Express 错误(没有冒犯)。 Express 的路由器将允许您拆分很多路由(同时允许您配置网站图标。请参阅Unable to Change Favicon with Express.js(第二个答案)。 使用 '/*' 路由只会捕获所有 GET 请求,这极大地限制了路由器可以为您做的事情。

(接 cmets;把它放在这里作为代码块) 既然您有一个支持会话的应用,请尝试这两条路线

app.get('/makesession', function (req, res) {
    req.session.message = 'Hello world';
    res.end('Created session with message : Hello world');
});
app.get('/getsession', function (req, res) {
    if (typeof req.session.message == 'undefined') {
        res.end('No session');
    } else {
        res.end('Session message: '+req.session.message);
    }
});

如果您在浏览器中导航到 /makesession,它将设置一个会话消息并通知您它已经完成。现在,如果您导航到 /getsession,如果会话消息存在,它将向您发送回会话消息,否则它将告诉您会话不存在。

【讨论】:

  • 我创建了具有会话支持的应用程序。关于 mysql,这个应用程序仅用于测试,我也试图了解路由的工作原理。对于路由,我有“subapp = require('./routes/subapp')”和“app.use(subapp);”在那个子应用里面我有 get "/subapp"
  • 我假设您从那时起编辑了您的问题,因为我不再看到您尝试设置 cookie。我假设它现在正在工作?
  • 尼克,还是同样的问题。现在我使用“express --sessions sessao”安装了一个新应用程序,并在 routes/index.js 中插入了“res.cookie('session', 'user', 'teste');”行并且在 routes/user.js 文件中的“console.log(req.session)”行和 console.log 没有 req.session.user 值
  • Express 将为您处理 cookie。删除 cookie 行。我将在答案中添加一些内容。
猜你喜欢
  • 2021-02-16
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多