知りたいこと
- 私が運営するwebページ(掲示板)にアクセスしてきたユーザーが、window.navigator.deviceMemoryの値を偽装してくることは可能でしょうか。
- 可能の場合、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したユーザーと同じフィンガープリントなら登録拒否する。
回答2件
あなたの回答
tips
プレビュー