node.js + express でWEBサービスを構築しようとしています。
ブラウザ側のIPアドレス、ブラウザの種類、OS情報などを、
サーバーにログとして残したいと思っています。
Requestオブジェクトの中の値から取れそうな気がして探しているのですが
どの値が適切か分かりません。
ご教授お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/16 02:52
回答3件
0
request-ipなどを使いましょう
js
1const { getClientIp, mw } = require("request-ip"); 2app.use(mw()); 3 4app.use((req, res, next) => { 5 console.log(getClientIp(req)); 6 next() 7}); 8
これでIPがコンソールに出ます
投稿2021/11/16 05:22
総合スコア2014
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
HTTPリクエストに関して勉強しましょう。
それを踏まえて利用しているWebフレームワークでのお作法を調査するという流れになります。
参考記事
- HTTPリクエストヘッダ - わわわIT用語辞典
- HTTPヘッダ一覧と親記事のネットワークの基礎講座 (株式会社クレス)
- Request header
ざっくり言うと、普段我々がブラウザを使ってWebサーバに通信する時、
各自が適当な文字列を送受信しあっていたら適切な情報の授受なんて出来ません。
何かしらの統一のルールが必要です。
なのでインターネットを作った人がRFCというインターネットの仕様書を作りました。
そこに「HTTP」という通信規約(プロトコル)を用意しています。
Webサーバとクライアントは「HTTP」のルールに従って情報の授受をしています。
ブラウザ側のIPアドレス、ブラウザの種類、OS情報などを、
サーバーにログとして残したいと思っています。
まず「IPアドレス」に関して解説します。
HTTPの基礎の部分になっているTCP通信に使われているので別ルートからの取得になります。
TCP通信では通信を受け取る際、送り主の情報がヘッダーに引っ付いています。
なのでそのヘッダー部分を閲覧することでどのIPアドレスかが分かるようになっています。
具体的にはフレームワーク毎にドキュメントを調べる必要があります。
Express.jsの場合は
app.get(url, (req, res) => {})
のreqはRequestのインスタンスであり、
req.ipのプロパティを閲覧すればIPアドレスが取得出来るようになっています。
IPアドレスが127.0.0.1
になってしまう場合、
NginX等のリバースプロキシを噛ませてある可能性が高いので
Expressをtrust proxy
モードで実行しましょう。
「ブラウザの種類」、「OS情報」はHTTPリクエストヘッダーのUser-Agentの値を利用します。
Express.jsに於いてはreq.get("User-Agent")
もしくはreq.header("User-Agent")
で取得出来るでしょう。
req.get
のAliasとしてreq.header
が定義されている事が確認できる
探すとexpress-useragentという質問に於けるこれこれ!みたいなライブラリ見つけました。
js
1const useragent = require('express-useragent'); 2 3app.use(useragent.express()); 4 5app.get('/', (req, res) => { 6 res.send(req.useragent); 7});
js
1{ 2 "isMobile":false, 3 "isDesktop":true, 4 "isBot":false, 5 ..... 6 "browser":"Chrome", 7 "version":"17.0.963.79", 8 "os":"Windows 7", 9 "platform":"Microsoft Windows", 10 "source":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79..." 11}
うーん、これは楽。
しかし、User-Agentの仕様を見ればわかりますが、
別に書式が統一されているわけではなく、
ブラウザ達が辛うじて空気読んで横並びの文字列を設定しているに過ぎません。
最初のMozilla/5.0
とか意味不明
経緯を調べると1990年代にネットスケープというブラウザがシェアを取っていたが、User-Agentを判別してそれでしか動作しないWebサーバがあり
他のブラウザまでもが詐称の為にUser-AgentにMozilla/番号
の記載し始めたのが起原だとか……
大昔の慣習の名残かよ
参考記事: UserAgentからOS/ブラウザなどの調べかたのまとめ - Qiita
という風に、世間一般で流通しているブラウザは大体が慣習に従って命名していますが、そもそも自己申告です。
例えばコマンドラインからHTTPリクエストを発射出来るcurl
というプログラムがありますが、
curl -H "User-Agent: hoge" https://example.com/
という風に好き勝手なUser-Agentを指定してHTTPリクエストを飛ばせます。
私が仮にXSSからのセッションハイジャックを使って悪さをしていたとして、
XSSでセッション情報を抜き取る時にUser-Agentもコピーしてヘッダーにつけて不正アクセスするわなって感じです。
厳密な一個人を特定するとか、不正ログイン検知の用途に使うのは中々難しいのが現状です。
AppleやGoogle、Amazonなんかは初めての端末でログインすると、
「これ本物か?」と他の端末に対して聞いてくるような仕組みが備わっています。
何の技術使ってるんでしょうね?フィンガープリントとか?秘匿情報だから分からん……
なので自分のWebサービスにGoogle等のログインシステムを移植するOAuthを使ってタダ乗りさせて貰うのが楽で良いと思います。
企業でやってて個人情報を抜く必要があるとかなら頑張ってください。
投稿2021/11/16 05:15
総合スコア21203
0
投稿2021/11/16 02:55
総合スコア7337
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/16 03:13
2021/11/16 03:54
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。