Discourse Fingerprint - Plugin d'empreinteur de navigateur

Empreinte Discourse :paw_prints:

Empreinte Discourse est un outil conçu pour les gestionnaires de communauté dans leur combat contre les trolls d’Internet. :troll: Il fonctionne en calculant un identifiant unique (une empreinte) pour chaque utilisateur inscrit, en tenant compte de plus de 20 caractéristiques du navigateur, telles que l’agent utilisateur, la résolution d’écran, le fuseau horaire, la mémoire de l’appareil, etc.

Lorsque chacune de ces caractéristiques du navigateur est considérée séparément, elles ne suffisent pas à déterminer si deux utilisateurs sont identiques. Il existe un nombre relativement restreint d’agents utilisateurs, de résolutions d’écran, etc. Cependant, lorsque l’on prend en compte l’ensemble de ces 20 facteurs, la probabilité que deux utilisateurs aient la même clé est extrêmement faible.

:bar_chart: Moment des mathématiques : Supposons qu’il n’existe que 20 caractéristiques de navigateur et seulement 4 valeurs possibles pour chacune d’elles (note : il existe plus de 20 caractéristiques de navigateur avec bien plus de 4 valeurs), cela signifie qu’il y a 420 combinaisons (empreintes). Cela représente 1 099 511 627 776 combinaisons… et il n’y a que 7 640 175 882 personnes sur Terre. Bon, certaines caractéristiques de navigateur peuvent être inutiles (par exemple, le fuseau horaire sera le même pour tous les utilisateurs d’un forum communautaire local)… mais il est peu probable que les forums aient 7,6 milliards d’utilisateurs non plus. :frowning:

Comment cela fonctionne-t-il ?

Lorsqu’un utilisateur navigue sur un forum, il se voit attribuer une empreinte et le résultat est stocké avec les quelques dernières empreintes (par défaut, les 10 dernières empreintes). Les administrateurs peuvent ensuite utiliser une interface simple pour vérifier les correspondances récentes d’empreintes (conflits) et déterminer si un utilisateur est en conflit avec un autre.

Le plugin n’a absolument aucun impact sur les utilisateurs et il calcule l’empreinte de l’utilisateur 3 secondes après le premier chargement de la page.

À quoi cela ressemble-t-il ?

Considérons un petit scénario de test :

  • Les utilisateurs Dan, Oliver et Jack ont utilisé un certain appareil (sessions incognito et normales).
  • Les utilisateurs Harry, Jacob et William ont utilisé un autre appareil (également sessions incognito et normales).
  • À un certain moment, l’utilisateur William s’est connecté en utilisant exactement la même machine et le même navigateur qu’Oliver.

Le tableau de bord indiquera qu’il y a deux conflits. L’un oppose Dan, Oliver, Jack et William, et l’autre implique Harry, Jacob et William. Veuillez noter que la relation de conflit n’est pas transitive (c’est-à-dire que Dan est en conflit avec William, Harry est également en conflit avec William, mais Dan n’est pas en conflit avec Harry).

Une vue détaillée de Dan nous indiquera quelles sont ses empreintes, quand elles ont été vues pour la première et la dernière fois, et avec qui il est en conflit pour cette signature.

Une vue détaillée de William nous donnera des informations similaires, mais cette fois en affichant deux empreintes.

Un administrateur peut choisir d’agir en conséquence ou cliquer sur le bouton « ignorer » pour masquer ce conflit. Veuillez noter que même si vous ignorez un conflit, il continuera d’apparaître dans les « derniers conflits » tant que de nouveaux conflits n’auront pas été détectés.

Comment l’installer ?

Suivez le guide Installer un plugin, en utilisant git clone https://github.com/discourse/discourse-fingerprint.git comme commande pour le plugin.

En gros, modifiez votre fichier app.yml pour inclure la commande spécifiée ci-dessus.

48 « J'aime »

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 « J'aime »

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

6 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

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

5 « J'aime »

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

7 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

Great plugin idea.

It’s missing a couple of translations
[en_US.dates.medium.x_years]
[en_US.admin.flags.ignore_flag]

And I can’t click on the ignore flag - important because as the administrator of the site, I need an ‘alternative ego’ to post as a regular user, not as the admin.

Where do I find finger print matcher?

I see it in plugins. But not the Matcher.

(SOLVED)
Forgot to refresh page. My Bad.

1 « J'aime »