Sécurité des votes

Le système de vote utilise plusieurs mécanismes pour garantir l'équité et prévenir les abus.

1. Limites de vote

max_votes_per_user

Définit le nombre maximum de votes qu'un utilisateur authentifié peut effectuer.

max_votes_per_user = 3 → L'utilisateur peut voter 3 fois maximum
max_votes_per_ip

Définit le nombre maximum de votes depuis une même adresse IP pour les utilisateurs non authentifiés.

max_votes_per_ip = 5 → 5 votes maximum depuis la même IP

2. Fingerprint

Le fingerprint est un identifiant unique généré à partir des caractéristiques du navigateur :

Comment ça marche ?

Le fingerprint est généré côté client par JavaScript et envoyé avec chaque vote. Le serveur l'utilise pour identifier l'appareil et appliquer les limites.

Logique de comptage des votes
Utilisateur AUTHENTIFIÉ
usedVotes = votes_anonymes(fingerprint) + votes_authentifiés(user_id)
maxVotes = max_votes_per_user
Exemple : 2 votes anonymes + 1 vote auth = 3 votes max
Utilisateur NON AUTHENTIFIÉ
usedVotes = votes_anonymes(fingerprint)
maxVotes = max_votes_per_ip
Exemple : 3 votes anonymes sur le fingerprint = 3 votes utilisés

3. Vérification OTP

Pour les sondages restreints, un code de vérification à 6 chiffres est envoyé par email :

  1. L'utilisateur saisit son email autorisé
  2. Un code OTP est envoyé par email
  3. L'utilisateur saisit le code pour vérifier son identité
  4. Le code expire après 5 minutes
  5. 3 tentatives maximum avant blocage

4. Prévention des abus

Mécanisme Description
Fingerprint Identifie l'appareil, même avec plusieurs navigateurs
Limite IP Empêche les votes multiples depuis le même réseau
Limite utilisateur Empêche les votes multiples avec le même compte
OTP Vérifie l'identité par email pour les sondages restreints
Token de session Identifie la session de l'utilisateur

5. Logique de la limite

Pour une même personne sur un même appareil (même fingerprint) :

// Méthode getUserVoteStatus()
if (authentifié) {
    used = votes_anonymes(fingerprint) + votes_auth(user_id)
    max = max_votes_per_user
} else {
    used = votes_anonymes(fingerprint)
    max = max_votes_per_ip
}