質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

3回答

1437閲覧

node.js expressのresオブジェクトについて

uroncha

総合スコア54

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2017/10/27 08:58

###質問です
node.js + express でWEBサービスを構築しようとしています。
ミドルウェアの引数のresオブジェクトに色んな情報を突っ込んで、サイトに表示しているのですが、resオブジェクトに個人情報やパスワードなどを含めてしまうのは、危険なやり方なんでしょうか?ブラウザ側でresオブジェクトの内容が見えてしまうような事ってあるのでしょうか?

###ソースコードのイメージ(内容は適当です)

javascript

1app.use(function(req, res, next) { 2 //SQLでログインユーザー情報を丸ごと取得(パスワード込み) 3 sql.select(query, function(err, result){ 4 res.locals.user = result.rows[0]; 5 } 6 next(); 7}); 8 9app.get("/", function(req, res){ 10 res.render('index.ejs'); //ユーザーの名前をサイトに表示 11}); 12 13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まず危険な箇所と危険ではない箇所を切り分けましょう。

質問文の状況下においてWebサイトにアクセスしたユーザーが持ち帰れるのは、
res.render('index.ejs');の行で出力したHTML文章のみです。

つまり、resオブジェクト自体にどんな危険な情報を格納したとしても、
index.ejs等のテンプレートエンジンが不用意に吐き出さなければ安全は確保されます。

またexpressは内部的にhttpパッケージをラッピングしているだけなので、
reqオブジェクトと、resオブジェクトはユーザーがアクセスする度に作られては破棄されます。

どこか別の場所に保存しておいて、違うユーザー相手に勝手に別ユーザーのパスワードを開示する
…といった意図的に危険な作りにしない限り、勝手に他のユーザーに個人情報が漏れる事はありません。


これはエンジニア側の対策の一つですが、
パスワードのような漏れると非常に困るような情報は、出来るだけ取り出さずに扱う事をオススメします。

例えば、ユーザー登録を行った場合、入力値を元にすぐDBに格納してしまいます。
そして、ログイン処理を受け付ける場合、ユーザーの入力値を元にDBへアクセスし、ユーザー情報が取得出来た事をもってログイン成功とします。

JavaScript

1connection.query(` 2 SELECT id, name, email 3 FROM users 4 WHERE password = ? 5`, [req.body.password], (error, results, fields) => { 6 if (!fields || fields.length === 0) { 7 return "ログインに失敗しました"; 8 } 9})

上記のような手法を取ればパスワードの変数を持ち運ぶ事無く使えますので、
こういった手法を使いながら不用意な情報を外に出さないように注意すると、他の箇所で失敗しても外部に漏れる事はありません。


次はそもそものHTMLの送受信に関わるお話です。

HTMLやそのリクエストは、平文のままインターネット回線上を伝わってクライアントとサーバーを行き来するので、
多少知識のあるクラッカーには簡単に盗聴されてしまいます。

参考サイト: SSL/TLS総合解説サイト

というわけで、お客様情報を取り扱う(ログイン認証)ページでは、確実にSSL証明書を導入しましょう。
SSL証明書を導入したWebサイトではリクエストやHTML等の情報が暗号化され、安全に通信することが可能です。
(まぁ、時間をかければ解けない暗号はないので、SSLで暗号化されてるからといってクリティカルな情報をばんばん流しまくるような事はしないでください)

ApacheやNginxといった所謂Webサーバーアプリは簡単にSSLと連携することが可能ですが、
Expressサーバーは手動でこの仕組を導入することになります。

参考サイト: Node.js + Express で SSL を使う - まだプログラマーですが何か?

投稿2017/10/28 04:00

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uroncha

2017/10/28 05:03

私が欲しい適切なアドバイスをいただきました。 勉強になりました。 ありがとうございました。
guest

0

Webサービスでパスワードは本当に重要な要素なので、ログイン時のリクエスト以外ではやりとり厳禁です。
HTTPSで暗号化してサーバで受け付けた後はセッションで認証を行いましょう。
更にサーバ側でもDBにSHA256、またはSHA512でハッシュ化して、万が一DBの内容が漏れても大事故に
繋がらないようにしておきます。

レスポンスにパスワードを乗せようとしているということは、ブラウザ側で認証を行わせようとしているのだと
思いますが、認証に限らず、入出力は必ずサーバで実装すべきです。
勿論ユーザビリティを考えてブラウザ側でも入力チェックをするのは良い事ですが。

投稿2017/10/27 17:13

nyakkys

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uroncha

2017/10/28 02:37

いろいろと親切にありがとうございました。 勉強になりました。
guest

0

ベストアンサー

resに入れるということはブラウザ側に戻すということですから全部見えてしまいますよ。
そういった情報はresに入れて戻すべきではないです。

投稿2017/10/27 11:26

yuki-saito

総合スコア928

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uroncha

2017/10/28 02:36

ありがとうございます。 ちなみにブラウザ側でresので送った内容を見るには、どのようにすればよいのでしょうか? 初心者ですみません。
miyabi-sun

2017/10/28 03:32

expressでユーザーに情報をDLさせるにはそれしか手段がないので、 resに入れて戻すべきではないというのは不適切ですね。
yuki-saito

2017/10/28 04:45 編集

> uronchaさん どのブラウザでも通信の情報は見ようとしれば見れちゃうんですよ。 ブラウザにもよりますがF12とか押すと色々見えます。 どうしても戻す必要があるのですか?
uroncha

2017/10/28 05:01

パスワードの判定はサーバー側で行うので、そもそもresに入れる必要はないのですが、fieldを選択するのが面倒くさかったので、レコード全体を代入するやり方をとっていました。どうやらresの内容はすべてブラウザ側に渡ってしまう訳ではなさそうですが、安全面をとってパスワードなどの情報は除いてresに代入するようにしようと思います。
yuki-saito

2017/10/28 12:17

そういうことだったのですね。 resオブジェクトをrender以外で使うことはあまりないかと思いますし、その方がいいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問