質問: result.rows[0]; } next(); }); app.get("/", function(req, res){ res.render('index.ejs'); //ユーザーの名前をサイトに表示 }); ```
回答: まず危険な箇所と危険ではない箇所を切り分けましょう。 質問文の状況下においてWebサイトにアクセスしたユーザーが持ち帰れるのは、 `res.render('index.ejs');`の行で出力したHTML文章のみです。 つまり、resオブジェクト自体にどんな危険な情報を格納したとしても、 index.ejs等のテンプレートエンジンが不用意に吐き出さなければ安全は確保されます。 またexpressは内部的にhttpパッケージをラッピングしているだけなので、 reqオブジェクトと、resオブジェクトはユーザーがアクセスする度に作られては破棄されます。 どこか別の場所に保存しておいて、違うユーザー相手に勝手に別ユーザーのパスワードを開示する ...といった意図的に危険な作りにしない限り、勝手に他のユーザーに個人情報が漏れる事はありません。 これはエンジニア側の対策の一つですが、 パスワードのような漏れると非常に困るような情報は、出来るだけ取り出さずに扱う事をオススメします。 例えば、ユーザー登録を行った場合、入力値を元にすぐDBに格納してしまいます。 そして、ログイン処理を受け付ける場合、ユーザーの入力値を元にDBへアクセスし、ユーザー情報が取得出来た事をもってログイン成功とします。 ``` connection.query(` SELECT id, name, email FROM users WHERE password = ? `, [req.body.password], (error, results, fields) => { if (!fields || fields.length === 0) { return "ログインに失敗しました"; } }) ``` 上記のような手法を取ればパスワードの変数を持ち運ぶ事無く使えますので、 こういった手法を使いながら不用意な情報を外に出さないように注意すると、他の箇所で失敗しても外部に漏れる事はありません。 次はそもそものHTMLの送受信に関わるお話です。 HTMLやそのリクエストは、平文のままインターネット回線上を伝わってクライアントとサーバーを行き来するので、 多少知識のあるクラッカーには簡単に盗聴されてしまいます。 参考サイト: SSL/TLS総合解説サイト というわけで、お客様情報を取り扱う(ログイン認証)ページでは、確実にSSL証明書を導入しましょう。 SSL証明書を導入したWebサイトではリクエストやHTML等の情報が暗号化され、安全に通信することが可能です。 (まぁ、時間をかければ解けない暗号はないので、SSLで暗号化されてるからといってクリティカルな情報をばんばん流しまくるような事はしないでください) ApacheやNginxといった所謂Webサーバーアプリは簡単にSSLと連携することが可能ですが、 Expressサーバーは手動でこの仕組を導入することになります。 参考サイト: Node.js + Express で SSL を使う - まだプログラマーですが何か?