2010-01-11 12 views
2

je remarquai que pour le vote en œuvre SO une méthode XHR qui des messages affichés sur un contrôleur de messages et envoie le type d'ID de poste et vote par l'URL, en plus d'un paramètre fkey est envoyé, par exemple:Stratégie pour un vote utilisateur unique tel que Stackoverflow?

http://stackoverflow.com/posts/1/vote/2 

Je suis Je vais mettre en place une technique similaire, je me demande quelle logique je pourrais utiliser pour éviter le double vote par le même utilisateur et empêcher le spam, en plus de la logique globale lors de la mise en œuvre de ce.

Le schéma de la table, je vais être de les stocker:

thread_id user_id vote_type 
2334  1   2 

Jusqu'à présent, je suis venu avec ces points de balle:

  • assurer que l'utilisateur est connecté
  • faire en sorte que un ID de poste valide et un type de vote valide sont envoyés
  • assurez-vous qu'après le POST, l'utilisateur n'a pas déjà voté
  • le code qui crée le hachage ne peut pas contenir d'informations dynamiques telles que l'agent utilisateur, car un utilisateur peut être sur un autre navigateur, un OS différent, non?

Mise à jour:

"SO utilise probablement le cookie de connexion pour identifier l'utilisateur." - Andrew

Est-ce que quelqu'un pourrait démontrer comment cela serait fait, ou en d'autres termes fournir plus précisément un exemple de la façon dont le fkey, qui est une chaîne alphanumérique de 32 bits, est généré?

Question:

  • depuis que je ne suis pas l'envoi de l'identifiant d'utilisateur réel partout avec mon code XHR, est-ce que cela signifie que je dois mettre à jour mon schéma de table afin que je puisse enregistrer le fkey au lieu de dire , le user_id? Le fkey devra probablement être unique à chaque utilisateur, et donc je peux probablement demander s'il y a une ligne dans la table de vote qui a un fkey de quoi que ce soit.

Apprécierait des conseils ou un aperçu sur quiconque a mis en œuvre une technique similaire.

+1

Pourquoi n'êtes-vous pas l'envoi de l'identifiant d'utilisateur réel n'importe où avec votre code XHR? –

+0

bien, j'ai remarqué que SO ne l'utilisait pas, et peut-être pour une bonne raison .. on pourrait créer un formulaire personnalisé, mettre un champ id d'utilisateur avec une valeur, et le poster et ce serait une demande valide, non? Cependant, si vous utilisez quelque chose comme le 'fkey', il y a de fortes chances que personne ne puisse le programmer inversement pour obtenir le même hash basé sur l'utilisateur, c'est pourquoi je pense que SO utilise cette méthode. –

+3

SO utilise probablement le cookie de connexion pour identifier l'utilisateur. J'ai vérifié avec Firebug, et les cookies sont envoyés. – Jess

Répondre

1

Vous pouvez simplement signer les URI d'une manière ou d'une autre afin d'empêcher les utilisateurs de manipuler la valeur. Par exemple, vous pouvez hacher des parties de l'URI avec un secret et ajouter le hachage à l'URI. Lorsque les utilisateurs copient l'URI et modifient les valeurs, l'URI et la partie signée deviennent invalides. Ceci est souvent fait dans les API RESTful, et votre approche actuelle est similaire à.

1

Je pense que cela dépend de la façon dont vous voulez empêcher les utilisateurs de soumettre à nouveau ou de manipuler vos données.Rien ne sera 100% (à moins que votre budget par le toit), mais vous pouvez faire un bon travail de garder la plupart des gens de resoumettre par:

  • vérifier leur UID - ou ID généré à partir de l'UID (je vais vous expliquer)
  • enregistrer leur adresse IP et vérifiez contre la DB pour l'IP et l'ID de soumission (ainsi que l'UID généré)

en utilisant seule la solution IP, peut être vaincu en utilisant un proxy bien sûr, ou une connexion qui change souvent les adresses IP telles que le transporteur DSL dans ma ville (mais même alors, c'est tous les deux jours). Personnellement, je génère une clé unique basée sur l'ID utilisateur de cette personne, et la passe en arrière et en quatrième si nécessaire. Un hachage MD5 salé fonctionne généralement bien, ou même une implémentation AES si MD5 est considéré comme trop faible. Combinés ensemble, vous devriez avoir un bon point de départ.

+0

pouvez-vous inclure des exemples de md5 plus un sel dans ce contexte, avec l'ID de l'utilisateur? –

+0

$ new_uid = MD5 ($ user_name. "Ceci est mon sel"); avec $ new_uid, vous pouvez stocker cette valeur dans la base de données qui sera unique à chaque membre. Bien sûr, je suppose que chaque membre a déjà un identifiant unique tel qu'une adresse email sur laquelle il est basé (pour $ user_name). Vous pouvez ensuite effectuer une requête sur leur ip - $ ip = $ _SERVER ['REMOTE_ADDR']; et l'ID unique généré avec le hachage MD5 salé. Ce n'est pas parfait, mais une base pour travailler. – Liam

2

créer l'index UNIQUE sur les champs (thread_id, user_id) et DBENGINE vous protégera des commentaires multy sur un fil :)