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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1565閲覧

window.navigator.deviceMemoryの値を偽装される事はありますか?目的:会員制の掲示板にてBanしたユーザーが「再登録する事」を防ぎたい。

ID_7UGzV8hCHGs5

総合スコア58

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/03/08 12:06

編集2020/03/09 05:41

知りたいこと

  1. 私が運営するwebページ(掲示板)にアクセスしてきたユーザーが、window.navigator.deviceMemoryの値を偽装してくることは可能でしょうか。
  2. 可能の場合、window.navigator.deviceMemoryの値を偽装させない対策はありますか。

javascript

1var 悪質ユーザーのデバイスメモリ = window.navigator.deviceMemory; 2 3console.log(悪質ユーザーのデバイスメモリ); //8 ←この8を4とかに偽装されたくない。 4

知りたいことは上記に書いた事です。
これより下記は、上記質問に対して聞かれるかもしれない といった内容を書いてみただけです。

目的:悪質なユーザーによるアカウント登録防止

自分で作った会員制の掲示板があります。
(アカウント登録の際に必要な物は、メールアドレスのみ。)

悪質なユーザーがいた為、彼らのアカウントはログイン出来ないようにしました。
しかし彼らの一部は別のメールアドレスを作ってアカウント登録してきました。

アカウント登録しずらくしたいです。

(ついでに、私自身もフィンガープリントについて勉強しておきたい)

目的達成の手段

window.navigatorで取得できるメモリ数やタイムゾーン等の値を使用して悪質なユーザー等の
フィンガープリントを作り、彼ら(の端末)にはアカウント登録をさせない。

※平行して、canvasの描画データを使用したフィンガープリントも使いますが、それを偽装するブラウザ拡張機能(canvas Defender)が存在したため、あまりあてにしない事にします。

備考

アカウント登録の際に「電話番号を必要とする」対策もあるかと思いますが、それは避けたいです。
理由:それをやると普通のユーザーが面倒がって登録してくれないくらいの、(しょうもない)掲示板である為。

今回は妥協すると決めた点

悪質なユーザーと同じフィンガープリントを持つ普通の人も、アカウント登録できなくなってしまうが、今回はそれで良しとする。
(広告等の無い非営利な掲示板であり、新規ユーザーの獲得をメインの目的としていない為。)

試した事

userAgent(window.navigator.userAgent)を書き換えるコードをgithubで見つけました。
このコードの一部を改変して、私のコンピュータ上ではdeviceMemoryの値を変更出来てしまう事を確認しました。
このようなコードを他人が私の掲示板に流して、deviceMemoryの値を偽装してきたら嫌だなと思って質問しました。(技術的に出来るのかは知りません。)

▼userAgentを変更するコード
Override user agent on all browsers · GitHub

▼上記githubのコードを(deviceMemoryを変更するように)書き換えたコード

javascript

1function setdeviceMemory(window, deviceMemory) { 2 // Works on Firefox, Chrome, Opera and IE9+ 3 if (navigator.__defineGetter__) { 4 navigator.__defineGetter__('deviceMemory', function () { 5 return deviceMemory; 6 }); 7 } else if (Object.defineProperty) { 8 Object.defineProperty(navigator, 'deviceMemory', { 9 get: function () { 10 return deviceMemory; 11 } 12 }); 13 } 14 // Works on Safari 15 if (window.navigator.deviceMemory !== deviceMemory) { 16 var deviceMemoryProp = { 17 get: function () { 18 return deviceMemory; 19 } 20 }; 21 try { 22 Object.defineProperty(window.navigator, 'deviceMemory', deviceMemoryProp); 23 } catch (e) { 24 window.navigator = Object.create(navigator, { 25 deviceMemory: deviceMemoryProp 26 }); 27 } 28 } 29} 30 31console.log(window.navigator.deviceMemory); //8 32 33setdeviceMemory(window, 4); //4に書き換える 34console.log(window.navigator.deviceMemory); //4 35

追記:実装イメージ

HTMLのユーザー登録formから
1.メールアドレス
2.パスワード
3.フィンガープリント
の3つをサーバーに送信して、
3つのデータをphpでmySqlに登録する。
その際に、過去にBanしたユーザーと同じフィンガープリントなら登録拒否する。

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

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

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

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

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

miyabi_takatsuk

2020/03/08 13:23 編集

悪質なユーザーの定義を具体的にお願いします。 (攻撃者が、ロボットを対象とするか、人力を対象にするかを知りたい)
miyabi_takatsuk

2020/03/08 13:27

なんにせよ、フロントエンド側では限界あるかと思いますので、 フロントエンド側で、ブロックしつつ、バックエンド側でも二重にブロックした方がいいかと思いますが・・・。
ID_7UGzV8hCHGs5

2020/03/08 13:56

こんにちは 対象者はロボットではなくて(おそくらく)人間です 悪質なユーザーの定義ですが(悪質と言うと言葉がキツすぎて失礼ではありますが) 例えば、「某アイドルグループ好きな人専用の掲示板」で、嫌いな人は登録しないでください。と書いてあるにもかかわらず、 「某アイドルグループなんか嫌いだ」という書き込みをするユーザーを指しています。
ID_7UGzV8hCHGs5

2020/03/08 14:46 編集

バックエンド側でも・・ 頑張ります。(「バックエンド側 対策」とググる事から始めるくらいのレベルですので、まずは質問した内容のフロントエンド側から1歩ずつ勉強しながら対策していってみよう。という感じですm(__)m) 誤:フロントエンド側から 正:フロントエンド側で得られる情報から
miyabi_takatsuk

2020/03/08 14:21

なるほど・・・。 対人間となると、様々な部分でフィルタリングしないといけなく(通常のユーザーを対象外にするために)バックエンドでなければ得られない情報も使う必要があります。 また、ユーザー登録はDBに保存してるのですか? それとも、もしや、フロントエンドのみでやってるなら、Firebaseとかお使いですか? であるならば、firebaseの質問タグもつけたほうが、回答つきやすくなるかと思います。
m.ts10806

2020/03/08 14:26 編集

値どころかコード自体、ブラウザの機能などで書き換え可能なのですけど、そこは考慮するんでしょうか。
ID_7UGzV8hCHGs5

2020/03/08 14:40

@miyabi_takatsuk 2020/03/08 23:21 なるほどですm(__)m ユーザー登録はDB(mysql)にメールアドレスとパスワードとその他小さな情報(ログイン回数等)を保存しています。
ID_7UGzV8hCHGs5

2020/03/08 14:42

>値どころかコード自体、ブラウザの機能などで書き換え可能なのですけど こんにちは。知りませんでした。まったく考慮していませんでした。
miyabi_takatsuk

2020/03/08 14:44

え、、、そのDB登録は、javascriptで行ってるんですか? それともサーバーサイド(バックエンドです)で行ってるんですか? フロントエンドのjavascriptでDBコントロールしてるなら、運用方法を根本的に見直すべきかと思います。 セキュリティもくそもないのでめちゃくちゃ危険です。
ID_7UGzV8hCHGs5

2020/03/08 15:10

DB登録は、PHPにて行っております。(HTMLで作ったformで送信して、PHPファイルにてPOST値を受け取り、DBへのinsertはPDOインスタンスを使ってprepareしてexcuteしています。)
miyabi_takatsuk

2020/03/09 00:38

おお・・・。 であれば、PHPでDB登録もしていることを質問本文に記載し、質問タグも追加された方がいいかと(PHPも使用できると示す)。 セキュリティ部分はPHPでバリデーションなどした方がいいかと思いますよー そこら辺は、回答するには、質問者さんのPHPコードがないため、PHPの回答はしかねますが、なので、既についている回答が的を射ているかと。
ID_7UGzV8hCHGs5

2020/03/09 05:50

@miyabi_takatsuk ありがとうございます。 PHPのタグをつけておきました。 セキュリティ部分について頑張ります。
ID_7UGzV8hCHGs5

2020/03/09 05:52

@m.ts10806 >値どころかコード自体、ブラウザの機能などで書き換え可能 これがベストアンサーでした。 ありがとうございましたm(__)m
guest

回答2

0

悪質なユーザーと同じフィンガープリントを持つ普通の人も、アカウント登録できなくなってしまうが、今回はそれで良しとする。

いえ、window.navigator.deviceMemoryを使う場合、これは致命的な問題となります。

このプロパティは、0.51248といったごく限られた値しか返さないので(MDN)、これでユーザーを弾いてしまうと巻き添えのほうが圧倒的に多くなってしまいます。

投稿2020/03/08 14:53

maisumakun

総合スコア146018

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

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

maisumakun

2020/03/08 14:54

…って、セキュリティにまつわることをフロントエンドのJavaScriptでやろうとしていること自体が問題だったか。
ID_7UGzV8hCHGs5

2020/03/08 15:26

こんにちは。 一応、deviceMemoryの値だけではなく、インストールされているfontの数など得られる情報をできるだけ多く使用してフィンガープリントにしようと思っております。(そうすれば、本当に多少、巻き添えが減ってくれるかな ぐらいのレベルですがご了承ください。) 本質的な目的は「会員制の掲示板にてBanしたユーザーが「再登録する事」を防ぎたい。」なので皆様それに対して答えていただき感謝しておりますが、(私自身が)それについて調べたり考える為の足掛かりとしてとりあえず1つ「window.navigator.deviceMemoryの値」が偽装されることがあるのか疑問に思ったため知りたかった次第です。 googleにて 「window.naigator 書き換え」 「window.naigator 偽装」などと簡単に(1日中)調べた結果、 「偽装できるのか出来ないのか」分からなかったため質問を投稿しました。 足がかりとなる検索ワード等教えていただけないでしょうか。
maisumakun

2020/03/09 00:22

上のコメントのとおりです。JavaScriptで実行する機能は、ユーザーの手元でいくらでも書き換え可能ですので、攻撃者に対するセキュリティとしてはほぼ意味をなしません。
退会済みユーザー

退会済みユーザー

2020/03/09 00:40

手段問わなければすべて偽装可能だけどね
ID_7UGzV8hCHGs5

2020/03/09 05:48

@maisumakun @asahira1979なるほどです。ありがとうございました。 (「JavaScriptで実行する機能をユーザーの手元で書き換えできる」という(回答して頂いた方等からするとおそらく当然の事実を)知らなかったのが申し訳ないです。へんてこな質問に答えて頂きありがとうございましたm(__)m)
guest

0

ベストアンサー

window.navigator.deviceMemoryの値を偽装してくること

サーバへ送信する場合、値をそのまま使用することを強制できないので、ごく簡単に別の値を送信することが可能です。

投稿2020/03/08 22:18

編集2020/03/08 22:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問