2 votes

Comment éviter qu'un utilisateur supprime sa session

L'utilisation

Actuellement, j'essaie de construire une page où les utilisateurs peuvent voter sur du contenu (up/downvote, similaire à la fonctionnalité sur le réseau StackExchange). Mais les utilisateurs ne devraient pas avoir besoin de s'inscrire pour voter sur le contenu. Donc ce serait une sorte de page de vote "anonyme". Elle est construite avec Laravel5 et utilise une base de données MySQL pour stocker les votes. Les sessions utilisateur sont stockées dans des fichiers plats, mais peuvent également être stockées dans une table de base de données (L5 est assez flexible ici).


Le problème

Comment le rendre sécurisé ?.

Je stocke les restrictions et les contenus déjà votés dans les sessions utilisateur, par exemple lorsque l'utilisateur a voté sur le contenu XYZ (ainsi l'utilisateur ne peut pas revoter sur le contenu spécifique pour le moment). Ces restrictions sont basées sur le temps, principalement de 24 à 48 heures. Cela fonctionne bien, tant que l'utilisateur ne supprime pas ses cookies, ce qui créerait une nouvelle session et supprimerait les restrictions de temps, ce qui pourrait entraîner une fraude au vote facile.

Alors, comment éviter que l'utilisateur "perde" sa session ? L'accent est mis sur la manière de maintenir les restrictions et les limitations de chaque utilisateur "anonyme" ! Les PCs partagés ou les votes à différents endroits ne peuvent pas être évités lors du vote anonyme, mais le "botting" ou une fraude au vote en grand nombre doit être évité avec une solution donnée.


Tentatives de solution

Définir l'ID de session de chaque session utilisateur comme une combinaison d'IP et d'User-Agent

J'ai posé une question sur cette tentative (liée ci-dessous), mais cela ouvrirait plus de problèmes que cela en résoudrait (par exemple, un spoofing de session facile). De plus, je n'ai pas réussi à définir manuellement l'ID de session en utilisant Laravel5.


Solutions qui ne conviennent pas

  • Demander à chaque utilisateur de s'inscrire (c'est tout simplement trop d'efforts pour chaque utilisateur dans mon cas d'utilisation)

Liées

1voto

aimme Points 3152

Comme les utilisateurs ne sont pas stockés et maintenus, il est très difficile de garantir à 100%.

Comment j'essaie d'atteindre cela au plus près est en utilisant l'adresse IP de la requête et le jeton CSRF. vous pouvez obtenir l'adresse IP à partir de la requête et csrf_token() de n'importe où à l'intérieur de votre application Laravel.

voici un exemple de comment je vais implémenter

créer une table nommée votes ayant les champs suivants

  • votable_type
  • votable_id
  • ip_address
  • csrf_token

je vérifierais si un client n'a pas déjà un enregistrement pour le même type de votable et id. le client est le csrf_token. l'ip est là pour garantir que les requêtes sont légitimes.

le type et l'id votable sont la relation polymorphique entre les commentaires, les publications, etc.

note

sans conserver d'identification de l'utilisateur d'une manière ou d'une autre, certains utilisateurs pourraient ne pas voter du tout ou certains pourraient voter deux fois. cela ne peut pas être fait parfaitement.

  • certains utilisateurs pourraient voter à partir de multiples agents utilisateurs différents.
  • certains utilisateurs pourraient falsifier l'adresse IP ou effacer les cookies
  • différents utilisateurs pourraient utiliser le même système pour se connecter.
  • certains utilisateurs pourraient utiliser différentes connexions ou systèmes de connexion.

donc, même en prenant toutes les informations, cela ne serait pas 100% précis.

0voto

manniL Points 3321

Ma solution consistait à implémenter evercookie pour attribuer un "cookie d'identification" par utilisateur, détecter la navigation privée et restreindre l'accès en cas de mode Incognito ou de navigation privée activée, et enfin restreindre plusieurs actions (voter dans mon cas) en l'absence d'evercookie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X