@bockring

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JSのデバイスフィンガープリントが重なりすぎる

解決したいこと

Webブラウザ上で利用可能な投票サービスにおいて,重複投票を禁止するためのデバイスフィンガープリント認証がバグること.

発生している問題・エラー

投票を実行しているデバイス上で,まだ投票をしていないのに「投票済み」と表示され,サービス利用ができないこと.

私の学校のクラスで試験導入し,その半数のアンケート結果によると半数が投票できていない状況でした.そしてアンケートに答えていない人も含めると投票できた人は39人中の15人しかいなかったです.

投票できない,というのは以下のような画面のことを指します.
IMG_0722.jpeg

該当するソースコード

fingerprint.jsvote.jsのコードをGitHub上から表示しておきます.

デバイスフィンガープリントに使用している情報は以下の10種類です.

  • User Agent
  • 言語
  • 画面解像度
  • タイムゾーン
  • プラットフォーム
  • CPUコア数
  • デバイスメモリ
  • タッチサポート
  • Canvasフィンガープリント
  • WebGLフィンガープリント

これらの10種類は,そうそう重ならない物だと思っていたのですが,同種の端末だからか重なってしまったのかもしれません.

自分で試したこと

フィンガープリントと共に使用しているCookie認証の緩和

重要な補足

このサービスは学校で使っている物であって,製との端末は全て一緒です.CPUコア数や画面解像度,言語,タイムゾーン等の情報が揃いやすく,そのうえOSバージョンも揃いやすい状況です.

そのような状況でも他の人のデバイスと重なりにくいフィンガープリント情報を教えていただけると助かります.


またデバイスフィンガープリントの情報はGoogle Firebase Realtime Detabase上でリストデータとして格納しています.そのデータがリセットされる(=投票数がゼロになる)とスレーブも再読み込みをかけ投票ブロック状態を解除します.解除(リセット)はマスターでかけるためCookieやデバイスストレージの利用はバグの元であることは既に確認済みです.

0 likes

2Answer

投票後にlocalStorageやCookieにデータを入れればよいのではないでしょうか?

1Like

Comments

  1. @bockring

    Questioner

    ご回答ありがとうございます.
    当初はCookieにも認証データを格納していたのですが,「どちらかに投票済みデータが存在すれば投票ブロック」というルールの場合はFirebase上でのデバイスフィンガープリントのリストデータ削除後もCookie認証ではじかれ投票できないという問題に直面しました.このシステムではFirebaseに最も正しいとされる認証情報が書き込まれているため,逆に「Firebaseの投票ステータスにあわせてCookieを変更」にするとCookieの意味は無くなります.
    よってCookieやデバイスストレージを用いたサブ認証はしていません.

    マスターから投票ブロック状態を解除する必要があるのです.

学校のような全く同じ機器を揃えて導入しているような環境でfingerprintを使ったら当然同じ結果になりますよね、としか言えません。

解決方法はいくつかあると思いますが一つの例として書いてみます。

・投票画面にアクセスした際に、vote_tokenという名前のCookieを持っていなければ、「各学生毎に重複しない、かつ予測困難であるランダムな文字列」を内容に持つvote_tokenという名前のCookieを発行する。
vote_tokenという名前のCookieを既に持っている場合、その内容と投票済みフラグが既にDBに書き込まれていたら投票済みと判断する。
・投票完了時にDBにvote_tokenの内容と投票済みフラグを一緒に書き込む。
・リモート側で投票状況をリセットしたい場合は投票済みフラグを一律falseにする。

ブラウザを変えた場合やCookieを手動で変更・削除した場合は何度も投票できてしまう問題がありますが、これはfingerprintを利用する場合も同様の問題を抱えていますので許容できるものと想定しています。
もしこれを許容しない場合は他のやり方をする必要がありますが学生さんのようですのでぜひ考えてみてください。

0Like

Your answer might help someone💌