Autor Zpráva
mackopu
Profil
Pro anketu chci povolit hlasování po 30 dnech. Napadla mě kombinace cookies, IP adresy, prohlížeče a času posledního hlasování. Podstatné části kódu jsou zde:
<?php
$time_limit = (60*60*24*30); // 30 dní

// procedura uložení cookie
SetCookie("hlasoval", "ano", Time()+$time_limit);
// procedura uložení do databáze
$sql1 = "INSERT INTO $table_hlasovali 
SET ip='".$_SERVER['REMOTE_ADDR']."', 
browser='".$SERVER['HTTP_USER_AGENT']."', 
vote_time=NOW()";

// kontrola
$sql2 = "SELECT * FROM $table_hlasovali 
WHERE ip='".$_SERVER['REMOTE_ADDR']."' 
AND browser='".$SERVER['HTTP_USER_AGENT']."' 
AND (UNIX_TIMESTAMP(vote_time)+".$time_limit.") > ".Time();

$dotaz2 = mysql_query($sql2);
$pocet_hlasovani = mysql_num_rows($dotaz2);

if ($_COOKIE['hlasoval'] == "ano" || $pocet_hlasovani > 0) {
  // znemožním hlasování
} else {
  // povolím hlasování
}
?>
Nemá tento způsob nějakou chybu, o které nevím? Dá se ještě nějak vylepšit nebo rozšířit o další parametry, které lze MySQL dotazem porovnávat?
Žádné vygůglené řešení mi nepřišlo dost neprůstřelné.
Kajman_
Profil *
Stačí při každém požadavku změnit user agenta a můžu hlasovat kolikráte chci. Třeba by se dalo omezit nějakým limitem i hlasování z jedné ip s různými user agenty.

Osobně bych si asi ukládal do jedné tabulky parametry prohlížeče a ip včetně toho hlasování. Když budete chtít někdy ručně vyřadit podezřelé hlasování, tak v logovací tabulce budete vědět, kolik máte nesmyslných hlasů, ale nebude vědět, pro co hlasovaly.
mackopu
Profil
Kajman:
No, nevím. Zaprvé by to předpokládalo vypnutí nebo vymazání cookies ve všech mých prohlížečích a zadruhé bych pak mohl hlasovat jen tolikrát, kolik mám prohlížečů (což by tolik nevadilo). Nebo se pletu?
Kajman_
Profil *
Jsou nástroje, které umí měnit user_agenta, takže hlasování z jednoho prohlížeče nemusí být jen jedno.
mackopu
Profil
To je pravda, i když se v podobných praktikách nevyznám (často mě ale napadá, že bych je chtěl ovládat proto, abych se proti nim mohl účinně bránit). Na druhou stranu také existují IP anonymizery...
Řekněme ale, že tabulky z nějakého důvodu slučovat nechci. Jak by pak vypadal dotaz, který by limitoval hlasování z jedné ip s různými user agenty?
Nebo se snad dokonale (či co nejlépe) chráněná anketa napsat nedá? Musí přece existovat nějaké optimální řešení.
Díky za každou pomoc.
Mastodont
Profil
"Dokonale" chráněná anketa je možná v případě, kdy necháš hlasovat jen registrované a přihlášené lidi.
Kajman_
Profil *
mackopu:
Jak by pak vypadal dotaz, který by limitoval hlasování z jedné ip s různými user agenty?
$sql3 = "SELECT count(*) pocet FROM $table_hlasovali 
WHERE ip='".$_SERVER['REMOTE_ADDR']."' 
AND vote_time > date_sub(now(),$time_limit second)";
Kcko
Profil
mackopu, nebud paranoidni, koho by bavilo hlasovat treba 50x do jedne ankety. Nebo to jsou ankety, ktere rozhoduji o nejakych extremne dulezitych vecech?
mackopu
Profil
Mastodont:
Pochopitelně, jak jinak :-)
Kajman:
Díky. Prosté.
Kcko:
To není paranoia, to je stihomam :-) Ale vážně - k čemu polovičaté řešení, když by se to mohlo dotáhnout do optima, ne?
Kcko
Profil
mackopu:
Do optima? Zivot je docela kratky abys vse dotahoval do optima :) Musis najit rozumny kompromis mezi kvalitou a casovosti.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: