0

目前,我正在开发一个基于HTTPS Node.js 服务器的基于 socket.io 的聊天。我已经成功完成了创建自签名证书以运行服务器的正确步骤。我想实现一个 CPU 和 RAM 高效的登录系统,最好不使用任何额外的 Node.js 模块。

目前,这就是我设置用户数据库的方式:

  1. 在服务器启动时,服务器读取并字符串化包含用户数据的 JSON 文件,并将数组加载到内存中。数据库示例如下所示:[{"user":"username", "pass":"password", "id":"23a45b"}]
  2. 当从登录表单向“/login.html”发送 HTTP POST 请求时,服务器会执行此 FOR 循环,其中postdata是 HTTP POST 并且userdata是用户数据库:
    for (var i = 0; i < userdata.length; i++) {
                if (postdata.user === userdata[i].user) {
                    if (userdata[i].pass === postdata.pass) {
                        res.writeHead({"Set-Cookie":"chat_user=" + userdata[i].user}, {"Set-Cookie":"chat_id=" + userdata[i].id});
                    }
                }
            }
  3. 当用户想通过 socket.io 发送消息时,他们会连同他们的用户名和 ID 一起发送消息。另一个 FOR 循环将搜索用户数据库并交叉检查 ID 和用户名以确保它们匹配。每次发送消息时都会发生这种情况。

以下系统听起来是否高效且安全?我可以改进和改变什么?我担心的是,将整个用户数据库保存在内存中对于简单的服务器来说太多了,而且 CPU 可能会做更多有用的事情,然后每次发送消息时检查数据库。

4

1 回答 1

1

我对您的代码的第一个担忧是它暗示密码以明文形式存储在您的 JSON 文件中。请不要这样做,这是一场等待发生的安全灾难。如果有人入侵了您的应用程序并获取了您的 JSON 文件,他们将拥有每个用户的登录名和密码,并且如果您还存储了用户的电子邮件地址(例如登录名),那么攻击者可以尝试破解用户的电子邮件帐户(因为很多人在任何地方都使用相同的密码)。

您应该以摘要形式存储密码,方法是在密码上应用 SHA-1 之类的加密哈希函数(添加盐!)。在此处此处阅读更多信息。

其次,要回答您关于效率的问题,为什么不使用真实的数据库而不是 JSON 文件呢?我了解您一开始可能有简单的需求,但从长远来看,您肯定会受益于拥有更强大的数据存储和检索方式。如果您需要添加新用户或删除用户,您的 JSON 文件会发生什么情况?您不需要停止服务器并重新加载数据吗?如果你真的想使用内存中的用户列表,你应该有一种更直接的方式来访问记录,而不是每次都循环整个集合。例如,您可以构建一个哈希表:

var usersHash = new Array();
for(var i = 0; i < userdata.length; i++) {
    usersHash[userdata[i].user] = i;
}

这会在您的用户表上建立一个简单的索引,允许您直接访问记录,如下所示:

var user = userdata[usersHash[postdata.user]];
于 2013-03-02T20:28:00.430 回答