2011-10-21 9 views
11

OK, quindi sto progettando di creare un sito Web con funzionalità upvote/downvote. Senza entrare troppo nel dettaglio del resto del sito, gli utenti saranno in grado di inviare contenuti che possono essere votati (in modo simile a reddit in questo senso, e solo in questo senso). Gli unici "account" su questo sito web saranno per amministratori e moderatori, che mi portano alla domanda principale:Il modo migliore per implementare upvotes/downvotes su un sito web?

Come limite i voti a uno per utente per post, nel miglior modo possibile, senza account?

Il sito sarà effettuato anche con Django e MySQL, che mi porta alla mia seconda domanda:

Come faccio a conservare voti in un database MySQL? Devo memorizzare un numero intero in un campo in ogni post o dovrebbe essere una tabella con un voto per riga? La mia ipotesi è sicuramente la prima, ma non ho mai lavorato prima con qualcosa del genere, quindi voglio essere sicuro.

Qualcuno potrebbe indicarmi la direzione generale su come implementare la funzionalità che desidero? Ci stavo pensando, e ho pensato ai metodi che utilizzano variabili di sessione, cookie e/o indirizzi IP. So che nessuna soluzione è perfetta senza account, ma voglio solo qualcosa che funzioni abbastanza bene da impedire alle persone di spammare voti. Sono all'oscuro, quindi tutto l'aiuto è apprezzato.

+0

È necessario memorizzare gli upvotes ei downvotes separatamente, non da ultimo a causa di problemi di concorrenza che aggiornano il conteggio dei voti. – fredley

+3

Limitando tramite l'indirizzo IP si perde una grande fetta di voti possibili. Molte scuole, aziende e anche dormitori usano 1 indirizzo IP esterno per molti utenti. Non esiste un buon modo per implementare un sistema senza avere account utente. Perché limitare a 100 dipendenti il ​​voto di 1 persona sarà impreciso, proprio come non avere un limite IP. – JClaspill

+0

@JClaspill Avrei dovuto accennare a questo nella mia domanda, ma il sito web è in realtà rivolto agli studenti della mia università (ho anche intenzione di rendere i contenuti di posting esclusivo per loro). Quali sono le possibilità che la mia università di oltre 28.000 studenti utilizzi lo stesso indirizzo IP per tutti? – GRardB

risposta

7

Con grande difficoltà.

La ragione per cui la maggior parte degli altri siti che utilizzano gli account di upvote/downvoteing è perché non c'è praticamente nessun altro modo per garantire che un utente non possa votare due volte la stessa cosa.

Le informazioni disponibili a voi che dovrebbe "stretta" la vostra portata dal fatto che questo utente ha votato prima di IS:

  • Il loro indirizzo IP
  • loro stringa UA (può essere utilizzato per restringere ulteriormente il campo dopo il primo)
  • tutti i dati cookie/sessione è stato memorizzato sul proprio browser

Come si può chiaramente vedere, tutte queste informazioni sono soggette a modifiche e la maggior parte di esso può essere controllato a volontà da un utente malintenzionato. Se vuoi proteggerti da utenti malintenzionati, la via migliore è rappresentata dagli account utente.

Se si desidera solo per proteggersi da utenti legittimi doppio voto, basta usare gli indirizzi IP - sono persistenti abbastanza che mediamente gli utenti non saranno in grado di votare due volte in un breve lasso di tempo.

Mi dispiace di non poter essere di maggiore aiuto, per quanto ne so, questa è ancora una di quelle Grandi Domande Senza Risposta. Molte persone vorrebbero essere in grado di garantire che un visitatore sia uguale o diverso dal visitatore precedente, per centinaia di motivi diversi, ma non è possibile utilizzare la tecnologia corrente.

+0

Ancora non è possibile 6 anni dopo, purtroppo. Il fingerprinting del browser è una tecnica che puoi usare, ma non è neanche lontanamente una garanzia e incredibilmente facile da ignorare come utente malintenzionato.Gli account utente sono ancora la strada da percorrere. –

0

Conservare una tabella di voti:

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

Controllare questo durante la pubblicazione di controllare questo ip non ha postato su questa domanda prima. Non perfetto, ma piuttosto buono.

Sommare questa tabella nella colonna vote_value per un dato post_id per trovare i voti per un post.

0

Per dirla semplicemente il modo migliore per limitare gli utenti di votare più di una volta è quello di replicare da IP (ammesso che non si vuole obbligare l'utente a fare il login e disporre di un account. I cookie possono essere cancellati facilmente o l'utente potrebbe semplicemente cambiare il loro browser.

Guardate nel tracciamento della IP utilizzando PHP e memorizzarli in un DB. http://php.net/manual/en/function.getenv.php

3

mi raccomando di utilizzare gli account utente per ridurre al minimo i problemi. utilizzando IndirizzoIP non è un Compito facile: prendi il semplice esempio che alcune aziende forniscono solo un indirizzo IP al mondo esterno la tua comunità non avrà una distribuzione adeguata e le persone possono mettere in discussione il tuo sistema di voto. Ma se si decide di andare con il sistema di account utente, è possibile seguire qualcosa di simile:

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  |    | 
+--------------+------------------+------+-----+---------+----------------+ 

Inoltre è possibile utilizzare un modello diverso, dove si dispone di una sola colonna voto e negativo get dedurre dal positivo.

Spero che questo possa essere d'aiuto.

+1

con questo modello un utente può revocare due volte un post. – Ced

0

Vecchia domanda ma farò un tentativo.

In definitiva, qualsiasi sistema che tenti qualsiasi livello di legittimazione al voto contro utenti malintenzionati dovrà sfruttare CAPTCHA (o un equivalente di prevenzione bot), ma la creazione effettiva dell'account non è necessaria. Una volta che un utente verifica la sua umanità attraverso CAPTCHA, memorizza un cookie sul suo computer che codifica i suoi dati di indirizzo IP. Finché l'utente mantiene quel cookie, può votare con esso come chiave e puoi usare la chiave (indirizzo IP) come identificatore. Se il cookie viene eliminato in qualche modo, lo si dovrebbe semplicemente riautenticare tramite CAPTCHA e riconquistare il suo indirizzo IP.

Ovviamente, un utente malintenzionato potrebbe facilmente falsificare un IP, ma CAPTCHA gli impedirebbe di eseguire più di un numero alla volta, quindi sarebbe solo di disturbo come un utente malintenzionato in una rete basata sull'account che crea più account falsi.

Problemi correlati