Discourse Fingerprint - ブラウザフィンガープリンティングプラグイン

Discourse Fingerprint :paw_prints:

Discourse Fingerprint は、インターネットのトロールとの戦いにおいてコミュニティ管理者を支援するツールです。:troll: これは、ユーザーエージェント、画面解像度、タイムゾーン、デバイスメモリなど、20 以上のブラウザ特性を考慮して、各登録ユーザーの一意の識別子(フィンガープリント)を計算することで機能します。

これらのブラウザ特性を個別に考慮するだけでは、2 人のユーザーが同一人物かどうかを判断するには不十分です。ユーザーエージェントや画面解像度などの種類は比較的少ないためです。しかし、これら 20 の要因すべてを考慮すると、2 人のユーザーが同じキーを持つ可能性は極めて低くなります。

:bar_chart: 数学の時間: ブラウザ特性が 20 個のみで、それぞれに可能な値が 4 つしかない(注:実際には 20 以上の特性があり、それぞれの値も 4 つ以上あります)と仮定すると、組み合わせ(フィンガープリント)の数は 420 通りになります。つまり、1,099,511,627,776 通りです……地球上の人口はわずか 7,640,175,882 人です。まあ、一部のブラウザ特性は役に立たないかもしれません(例えば、タイムゾーンはローカルコミュニティフォーラムのすべてのユーザーで同じになるなど)……しかし、フォーラムに 76 億人のユーザーがいることはまずありません。:frowning:

仕組みは?

ユーザーがフォーラムを閲覧すると、フィンガープリントが生成され、その結果は最新のいくつかのフィンガープリント(デフォルトでは直近 10 件)とともに保存されます。その後、管理者はシンプルなインターフェースを使用して、最新のフィンガープリントの一致(競合)を確認したり、特定のユーザーが他の誰かと競合しているかどうかを確認したりできます。

このプラグインはユーザーに全く影響を与えず、ページが最初に読み込まれてから 3 秒後にユーザーのフィンガープリントを生成します。

見た目は?

小さなテストシナリオを考えてみましょう。

  • ユーザーの Dan、Oliver、Jack が、あるデバイス(シークレットモードと通常のセッションの両方)を使用しています。
  • ユーザーの Harry、Jacob、William が、別のデバイス(同様にシークレットモードと通常のセッションの両方)を使用しています。
  • ある時点で、ユーザーの William が Oliver と全く同じマシンとブラウザでログインしました。

ダッシュボードには 2 つの競合が表示されます。1 つ目は Dan、Oliver、Jack、William の間のもので、もう 1 つ目は Harry、Jacob、William を含むものです。競合関係は推移的ではない点にご注意ください(つまり、Dan は William と競合し、Harry も William と競合しますが、Dan と Harry の間には競合はありません)。

Dan の詳細ビューでは、彼のフィンガープリントが何か、いつ初めておよび最後に検出されたか、そしてその署名に基づいて誰と競合しているかがわかります。

William の詳細ビューでも同様の情報が表示されますが、今回は 2 つのフィンガープリントが示されます。

管理者はこれに対して対応するか、「無視」ボタンをクリックしてこの競合を非表示にすることができます。競合を無視しても、新しい競合が発生するまで「最新の競合」に表示され続ける点にご注意ください。

インストール方法は?

プラグインのインストールの手順に従い、プラグインコマンドとして git clone https://github.com/discourse/discourse-fingerprint.git を使用してください。

基本的には、app.yml ファイルを編集して、上記で指定されたコマンドを含めるだけです。

「いいね!」 48

Thanks for the plugin!

Don’t you mean:

i.e. Dan is in conflict with William, Harry is also in conflict with William, but Dan is not in conflict with Harry

「いいね!」 5

That is correct. Thank you, I have fixed the post.

「いいね!」 6

Is there a case study for this showing how well it has worked in the real world?

Thanks for the plugin!
This is a wonderful thing. It would be great to see him on: transifex

We are very interested in this, but should we be worried about the GDPR? Based on the plugin description it doesn’t seem to collect anything that GAnalytics already does.

How is the data stored? Is it automatically purged at some point of time or can it be purged manually?

「いいね!」 1

Related/Unrelated note: Some browsers are actively working on avoiding fingerprinting. For example Firefox will soon ship with the ability to block this and will be blocked by default soon too.

「いいね!」 7

Unfortunately I am not aware of any big communities that run this plugin. However, in the real world it seems to work pretty well. See https://panopticlick.eff.org/

It depends on how you see it. Every piece of information that is stored cannot be tied to a single individual, which is GDPR compliant. Combining them, you might be able to track individuals.

The plugin uses PluginStore to store at most max_fingerprints fingerprints (default value: 10), purging the oldest to make room for new ones.

I am not sure how their new protection works. In the past, browser extensions were relying on filenames or hashes to do it. Those methods are fragile and minor changes in the fingerprinting script can make them go undetectable.

「いいね!」 8

Big is relative, but I am going to try this in production (tappara.co) when we have our next service break. Could be as soon as next week or one after that.

So it stores 10 most recent prints. Is there a way to purge the prints manually? Are they purged if the user is deleted?

「いいね!」 1

I had high hopes from this plugin but unfortunately ios browsers mess up the whole plugin.

「いいね!」 5

The latest Firefox version already have this protection, opt-in for now. You can test it from Preferences - Privacy - Content blocking.

「いいね!」 7

There is no way from the UI, but technically, you could do it from the Rails console. Deleting the user does not purge old Fingerprints, but that is a bug I will have to fix. :slight_smile:

user = User.find_by_username("dan")
DiscourseFingerprint::Fingerprint.get_fingerprints(user.id).each do |fp|
  DiscourseFingerprint::Fingerprint.remove(user.id, fp)
end

Yes, I believe so. I remember a community had the same problem with mobile devices, especially iPhones due to their build similarity.

I will try and have a look. The news I read said they were using Disconnect’s list which could have been tricked with some little effort.

「いいね!」 5

Our trial in production is now live.

Should we expect a performance penalty due to this? Our traffic has extreme spikes, based on real time events. Summer time is off-season, so things will be quiet, but during the hockey season we are likely to meet the limits of our server.

One additional idea for fingerprinting the user – what about tagging the users with a unique cookie? That would provide additional information that Harry’s browser has Dan’s cookie? This would obviously happen on shared devices, but might potentially expose trolls that lack technical expertise.

Many thanks for the development efforts and we are most interested in seeing the results.

I would really like a feature to ban a fingerprint.

Missing translation

「いいね!」 1

How do I delete this plugin? Did a rebuild after removing the line from my app.yml but the plugin is still there.

Edit: no one can help deleting this?

How to ban a fingerprint?
I really need this feature.

It’s now enabled by default.

「いいね!」 5

素晴らしいプラグインのアイデアですね。

翻訳がいくつか不足しています。
[en_US.dates.medium.x_years]
[en_US.admin.flags.ignore_flag]

また、「フラグを無視」をクリックできません。これは重要です。サイトの管理者として、管理者ではなく一般ユーザーとして投稿できる「別の人格」が必要だからです。

指紋マッチャーはどこにありますか?

プラグインには表示されていますが、マッチャーは見当たりません。

(解決済み)
ページを更新し忘れていました。申し訳ありません。

「いいね!」 1