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

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

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

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

Q&A

解決済

2回答

2431閲覧

node.js(サーバーサイドとのやり取り)でページ遷移の基本的なことを知りたい

Izumo1101

総合スコア49

Node.js

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

0グッド

1クリップ

投稿2020/09/16 23:44

node.jsでサーバーを立ててクライアントとやり取りをしています。独学でやっているのでとんちんかんなことをしていると思います。

現状index.htmlからbuf.htmlへページ遷移する手順として、パスワードが通れば遷移、というやり方をしていまして、

index.html

javascript

1$(function(){ 2 $('#btn2').click(function() { 3 var pw = prompt('パスワードを入力してください。',''); 4 socket.emit('setUserPw', pw); 5 console.log(pw); 6 }); 7});

サーバー側 ※わかりやすく簡略化したものを書きます

javascript

1socket.on('setUserPw', function(pw) { 2 console.log(pw + "が送られてきました。") 3 var socketID = socket.id ; 4 5 var pwok = 1111; 6 var pwwr = 2222; 7 if(pw==1234){ 8 io.to(socketID).emit('UserPw', pwok); 9 console.log("承認通知を送りました"); 10 }else{ 11 io.to(socketID).emit('UserPw2', pwwr); 12 console.log("非承認通知を送りました。"); 13 } 14 });

再びindex.htm

javascript

1socket.on('UserPw', function(pwok) { 2 console.log(1,"承認されました"+ pwok); 3 window.location.href = 'http://192.168.1.1:8080/buf.html'; 4});

で望み通りの動きはしています。
クライアントhtml→サーバーへパスワード承認→サーバーから承認通知→クライアント側でページ遷移

ただこのやり方だとサーバー側のIPアドレスが変化した際そのたびにクライアント側の記述を修正する必要があります。しかもこれではソースを見て直接入力すればパス承認の意味なく遷移する気がします。

こういった場合どのような手法で遷移させるのが普通ですか?上記でいうとどのような修正になりますでしょうか。

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

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

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

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

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

maisumakun

2020/09/17 00:50

パスワード認証を入れていますが、その先のページには「どの程度のセキュリティ」を求めていますか?
Izumo1101

2020/09/17 01:02

ご質問ありがとうございます。 ほとんど価値のない情報しかなく、仮に「ある程度のスキル・ある程度の時間」をもって突破されても特に問題はない程度のセキュリティを求めています。 ちなみにこのシステム自体は閉じられた外部への接続のないネットワーク内で使用するつもりです。
guest

回答2

0

自己解決

自己解決方法
miyabi-sun様にいろいろと勉強させていただきつつ自己流の解決に至ったので記載します。
今回
・index.htmlに都度都度アドレス変更を記述したくない。
・index.htmlソースから遷移先のアドレスを知られたくない。
という2点が質問の意図でした。そこで認証強度やクッキー情報の扱いはさらに勉強を進めるとして、ひとまずの解決策として、サーバー側で

javascript

1socket.on('setUserPw', function(pw) { 2 console.log("役員パス" + pw + "が送られてきました。") 3 var socketID = socket.id ; 4 var pwok ='/buf.html'; 5         var pwwr = 0912 6 if(pw==1234){ 7 io.to(socketID).emit('UserPw', pwok); 8 console.log("承認を送りました"); 9 }else{ 10 io.to(socketID).emit('UserPw2', pwwr); 11 console.log("非承認通知を送りました。"); 12 } 13 });

とし、認証した結果を遷移先のurlとしてクライアントに返すようにしました。
クライアント側は

javascript

1socket.on('UserPw', function(pwok) { 2 console.log(1,"承認されました"+ pwok); 3 window.location.href = pwok; 4});

となりますので、ユーザーにソースから遷移先を知られることもなくなりました。
もちろんこのやり方がセキュリティ的にも今後の勉強的にも「逃げ」に近いことは自覚していますが、ひとまずの方法論(アイディア)として成立したのでこれを解決策とします。
ご回答の皆様、感謝です。

投稿2020/09/17 12:33

Izumo1101

総合スコア49

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

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

miyabi-sun

2020/09/17 13:21

閉じた環境ですし、 現段階では良い感じだと思います。 頑張ってください。
guest

0

うーん、確かにチグハグですね。
質問文のソースコードを読む限り、
「いや何でそんな質問が今更出てくるんだ?すでに解決しとるやろ?」という箇所がちらほら。

ここは根っこの部分から解説していきますので、
既に解決出来ている事、まだ解決出来ていない事を切り分けて行きましょう。

もしネットワーク周りの知識でわからない所があれば、
3分間ネットワーキングあたりを読むと良いでしょう。
古いサイトですがレジェンドです。

このシステム自体は閉じられた外部への接続のないネットワーク内で使用するつもりです。

閉じられた外部への接続がないネットワークをLANと呼びます。
LANを構成する為にはルーターというIPアドレスを割り当てて管理する端末が必要になります。

このルーターにLANケーブルを差して新しいPC等を接続させると、
DHCPという機能を使ってIPアドレスを割り当てます。

この時、各個人のPC側で「私このIPアドレスを使用したいです、空いてたら優先的に譲ってください」と申請を出す事が可能です。
これにより電源つけっぱなしのパソコンは「固定IPアドレス」で運用することが可能です。
「Windows IPアドレスの固定」みたいなワードでググればやり方は出てくるので調べてみてください。
(ルーター側の設定でも実現出来ます、権限があれば調査してみてください)

後はそのIPアドレスを周知して、
他の作業メンバーにブックマークに入れてもらったりメモを取ってもらうだけです。

ただこのやり方だとサーバー側のIPアドレスが変化した際そのたびにクライアント側の記述を修正する必要があります。
しかもこれではソースを見て直接入力すればパス承認の意味なく遷移する気がします。

socketが何処に接続しに行っているのか気になりますが、
index.htmlはWebサーバ越しに配信しているのであれば問題ありません。

なぜならば、ユーザーの手元にはサーバー側のコードは一切存在せず、
index.htmlとsocket通信で受け取った文字列しかないからです。

まぁ、パスワードを変えながら何万回と通信を試みる「総当たり攻撃」みたいな事をやれば突破されるでしょうけど、そこまで対策するか?という話になってきますね。

window.location.href = 'http://192.168.1.1:8080/buf.html';

もしこのbuf.htmlindex.htmlが同じIPアドレスのWebサーバ上に存在するのであれば、
window.location.href = '/buf.html';
こう記述する事が可能です。

でもまぁ、このパスワードをやり取りする用途だけでsocket通信やってますが必要ですか?
buf.htmlのURLを知られるとパスワードを覚える意味が無いのでひと工夫必要ですね。

認証はBasic認証で都度やれば良いんじゃないですか?
HTTPだとパスワード部分を含めた平文がインターネット回線上を通過するので微妙ですが
LAN内で閉じている環境ならば平文を盗聴される事態になってる時点でやばいですしね。

インターネット上に広く公開されているならば、
HTTPではなくHTTPSにすればパスワードの部分は暗号化されるので安全になります。
GitHubはHTTPS+ベーシック認証を推奨していますね。


【追記】 Webサービスに於けるページ遷移に関して

そもそもHTTPサーバの構造上、1回1回のHTTP通信は全て1度の通信が終わると完結してしまいます。
なのでログインしたか否かの情報も次の画面へ行くと消えてしまいます。
もちろんJavaScriptの変数の値も次の画面には持っていけません。

なので対策は大きく分けて下記になります

  • クッキーにログイン者の情報を持たせる(多くのWebサービスがこれ)
  • 毎ページ払い出すHTML内にログイン者の情報を含めて使いまわす(docomoのフィーチャーフォン用サイトで採用)

クッキーを使った認証はセッションと呼ばれ、
Webサーバで一時的に使えるトークンを吐き出してWebサーバとクッキーが各々で保持
それを突き合わせて、こいつは最後の利用から1時間以上経過してるからセッション切れ扱いでログインさせなおす……みたいな事が一般的です。

内部で閉じているならば
そんな厳密なものでなくても問題ありません。
クッキーにIDとパスワードをぶち込んでしまって、ページ遷移の度にクッキーを取り出して認証チェックすれば問題ありません。

後者の方法は主にベーシック認証で利用されるやり方です。
各種リンクやフォームにベーシック認証用のコードを都度貼り付ける事で実現出来るでしょう。

投稿2020/09/17 03:46

編集2020/09/17 06:31
miyabi-sun

総合スコア21203

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

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

Izumo1101

2020/09/17 04:14

ご回答ありがとうございます。 チグハグな理由としては、場当たりな知識の習得に終始してきた結果であり反省点です。 ご提示のネットワーク周りの知識については書かれて下さったことはすべて理解できます。実際にはある端末にてnodeサーバーを立てるわけですが、その端末(いわゆるサーバー機)についてもDHCPでIPアドレスを付与される形を求めていて、つまり固定で設定したくない状態です。 >buf.htmlのURLを知られるとパスワードを覚える意味が無いのでひと工夫必要ですね。 これが質問の本質となります。認証にBasicを利用したりとやり方は様々でしょうが、そこまで強い認証であることが必要ないのでsocketでパス認証を手軽にしようとしているところ。 つまりはサーバー側からクライアントにページ遷移をさせられないか、という事になります。そうしますとクライアント側では遷移先のURLを遷移するまで知れないわけですし。 質問に加えこのコメント自体もチグハグかもしれませんがご了承ください。
miyabi-sun

2020/09/17 05:15

なるほど、知りたいのはあくまでページ遷移の手法なんですね。 回答としてふさわしいものをいくつか挙げてみます。 ちょっとお待ちを。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問