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 :
- User-Agent (navigateur, OS, version)
- Langue et paramètres régionaux
- Résolution d'écran
- Profondeur de couleur
- Fuseau horaire
- Canvas fingerprint
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 :
- L'utilisateur saisit son email autorisé
- Un code OTP est envoyé par email
- L'utilisateur saisit le code pour vérifier son identité
- Le code expire après 5 minutes
- 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
}