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 に答える