2011-10-21 15 views
11

Muy bien, así que estoy planeando crear un sitio web con funcionalidad de votos a favor/en contra. Sin entrar en demasiados detalles sobre el resto del sitio, los usuarios podrán enviar contenido que pueda ser votado (similar a reddit en ese sentido, y solo en ese sentido). Las únicas "cuentas" en este sitio web serán para administradores y moderadores, lo que me lleva a la pregunta principal:¿La mejor manera de implementar votaciones ascendentes/negativas en un sitio web?

¿Cómo limito los votos a uno por usuario por publicación, de la mejor manera posible, sin cuentas?

El sitio también se hará uso de Django y MySQL, lo que me lleva a mi segunda pregunta:

¿Cómo almaceno votos en una base de datos MySQL? ¿Debo almacenar un número entero en un campo en cada publicación, o debería ser una tabla con un voto por fila? Mi suposición es definitivamente la primera, pero nunca he trabajado con algo como esto antes, así que solo quiero asegurarme.

¿Alguien podría apuntarme en la dirección general de cómo implementar la funcionalidad que quiero? Lo he estado pensando y he pensado en métodos que usan variables de sesión, cookies y/o direcciones IP. Sé que ninguna solución es perfecta sin cuentas, pero solo quiero algo que funcione lo suficientemente bien como para evitar que las personas envíen spam. No tengo ni idea, así que toda ayuda es apreciada.

+0

Debe almacenar votaciones alternas y votos a la baja por separado, sobre todo debido a problemas de concurrencia al actualizar el conteo de votos. – fredley

+3

Al limitar a través de la dirección IP, está perdiendo una gran parte de los posibles votos. Muchas escuelas, empresas e incluso dormitorios utilizan 1 dirección IP externa para muchos usuarios. No hay una buena forma de implementar un sistema sin tener cuentas de usuario. Debido a que limitar 100 empleados a tener 1 voto de la persona será inexacto, al igual que no tener límite de IP. – JClaspill

+0

@JClaspill Debería haber mencionado esto en mi pregunta, pero en realidad el sitio web está dirigido a estudiantes de mi universidad (incluso he estado planeando publicar contenidos exclusivos para ellos). ¿Cuáles son las posibilidades de que mi universidad de más de 28,000 estudiantes use la misma dirección IP para todos? – GRardB

Respuesta

7

Con gran dificultad.

La razón por la que la mayoría de los otros sitios que hacen cuentas de uso de votos a favor/downvote es porque prácticamente no hay otra manera de garantizar que un usuario no podrá votar dos veces sobre la misma cosa.

La información disponible para usted que debe "estrecha" de su ámbito de si el usuario ha votado antes es:

  • Su dirección IP
  • Su cadena de UA (se puede utilizar para reducir aún más el campo después de la primera)
  • Cualquier dato galletas/sesión que ha almacenado en su navegador

Como se puede ver claramente, toda esta información está sujeta a cambios y la mayor parte de ella puede ser controlado a voluntad por un usuario malintencionado. Si desea protegerse de los usuarios maliciosos, la mejor manera de hacerlo es con las cuentas de los usuarios.

Si solo quiere protegerse de los usuarios legítimos que votan dos veces, solo use las direcciones IP - son persistentes suficientes que los usuarios promedio no podrán votar dos veces en un corto espacio de tiempo.

Lo siento, no puedo ser de más ayuda, por lo que yo sé, esta sigue siendo una de esas grandes preguntas sin contestar. Muchas personas quisieran poder garantizar que un visitante sea igual o diferente al visitante anterior que recibieron, por cientos de razones diferentes, pero no es posible con la tecnología actual.

+0

Todavía no es posible 6 años después, ¡ay! La toma de huellas dactilares del navegador es una técnica que puede usar, pero no está cerca de una garantía y es muy fácil pasar por alto como un usuario malintencionado.Las cuentas de usuario siguen siendo el camino a seguir. –

0

almacenar una tabla de votos:

id | post_id | vote_value (+/-1) | ip 

Comprobar esto cuando la publicación para comprobar esta IP no ha publicado sobre esta cuestión antes. No es perfecto, pero es bastante bueno.

Sume esta tabla en la columna vote_value por un dado post_id para buscar los votos de una publicación.

0

En pocas palabras, la mejor manera de evitar que los usuarios voten más de una vez es realizar un seguimiento por IP (suponiendo que no desea obligar al usuario a iniciar sesión y tener una cuenta. Las cookies se pueden borrar fácilmente o el usuario puede simplemente cambiar su navegador.

Mira en el seguimiento de la IP usando PHP y almacenarlos en una base de datos. http://php.net/manual/en/function.getenv.php

3

yo recomendaría utilizar cuentas de usuario para minimizar los problemas. usando Dirección IP no es una Tomemos el ejemplo simple de que algunas compañías solo proporcionan una IPAddress al mundo exterior. En este caso su comunidad no tendrá una distribución adecuada y las personas pueden cuestionar su sistema de votación. Pero si usted decide ir con el sistema de cuenta de usuario, puede seguir algo como esto:

post_table 
+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| postId  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| userId  | int(10) unsigned | NO | MUL | NULL |    | 
| postTime | bigint(20)  | NO |  | NULL |    | 
| post  | text    | NO |  | NULL |    | 
| upVote  | int(11)   | YES |  | 0  |    | 
| downVote | int(11)   | YES |  | 0  |    | 
+------------+------------------+------+-----+---------+----------------+ 

user_of_website 
+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| userId  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| userName  | varchar(50)  | NO |  | NULL |    | 
| numPosts  | int(10) unsigned | NO |  | 0  |    | 
| postsCount | int(11)   | NO |  | 0  |    | 
+--------------+------------------+------+-----+---------+----------------+ 

También se puede utilizar un modelo diferente donde se tiene sólo una columna voto y deducir get negativo del positivo.

Espero que esto ayude.

+1

con este modelo, un usuario puede votar una publicación dos veces. – Ced

0

Pregunta anterior, pero voy a tomar una foto.

En última instancia, cualquier sistema que intente cualquier nivel de legitimidad de voto contra usuarios maliciosos tendrá que aprovechar CAPTCHA (o algún equivalente de prevención de bots), pero la creación de la cuenta real no es necesaria. Una vez que un usuario verifique su identidad humana a través de CAPTCHA, almacene una cookie en su computadora que codifique sus datos de dirección IP. Siempre que el usuario mantenga esa cookie, puede votar con ella como clave, y puede usar la clave (dirección IP) como identificador. Si la cookie se elimina de alguna manera, simplemente lo volverá a autenticar a través de CAPTCHA y volverá a capturar su dirección IP.

Por supuesto, un usuario malintencionado podría fácilmente falsificar una IP, pero CAPTCHA le impediría hacer más de unas pocas a la vez, por lo que sería tan disruptivo como un usuario malintencionado en una red basada en cuentas. múltiples cuentas falsas

Cuestiones relacionadas