Toon posts:

Toch nog mogelijk om te cheaten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een scriptje zodat iemand een cijfer kan geven
voor een foto, nu mogen alleen geregistreerde gebruikers een cijfer van 1 tot 10 geven,
en ik heb deze beveiliging erin:
PHP:
1
<?   include ("$adminpath/config.php");        // Fix for lamers that like to cheat on polls     $ip = getenv("REMOTE_ADDR");    $past = time()-1800;    mysql_query("DELETE FROM $prefix"._gallery_rate_check." WHERE time < $past");    $result = mysql_query("SELECT ip, pid FROM $prefix"._gallery_rate_check." WHERE pid=$pid");    list($ips, $pids) = mysql_fetch_row($result);    $ctime = time();    if (($ip == $ips) &amp;&amp; ($pid == $pids)) {    $voteValid = 0;    } else {    mysql_query("INSERT INTO $prefix"._gallery_rate_check." (ip, time, pid) VALUES ('$ip', '$ctime', '$pid')");    $voteValid = 1;    }    // Fix end     if($setRateCookies>0) {    // we have to check for cookies, so get timestamp of this rate    list($time) = mysql_fetch_row(mysql_query("SELECT date FROM $prefix"._gallery_pictures." WHERE pid=$pid"));    $timeStamp = formatTimestamp($time);    $cookieName = $cookiePrefix.$timeStamp;    // check if cookie exists    if($HTTP_COOKIE_VARS["$cookieName"] == "1") {        // cookie exists, invalidate this vote        echo $warn = "You already voted today!";         $voteValid = 0;    } else {        // cookie does not exist yet, set one now        $cvalue = 1;        setcookie("$cookieName",$cvalue,time()+86400);    }    }    // update database if the vote is valid     if($voteValid>0) {        mysql_query("update $prefix"._gallery_pictures." set votes=votes+1, rate=(rate*(votes-1) + $rate)/votes where pid=$pid");    }    // a lot of browsers can't handle it if there's an empty page     print '<html><head></head><body></body></html>';}?>

En toch vinden ze een mogelijkheid om dubbel te stemmen.
Hoe kan dit nu, en is het nog beter te beveiligen?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Beveiliging op IP is op zich redelijk makkelijk te omzeilen.. Als alleen geregistreerde gebruikers mogen raten, waarom hou je dan niet bij welke gebruiker al waarop gestemd heeft? Dat is de beste manier...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

[quote]
if($setRateCookies>0)
[/quote]

Is $setRateCookies altijd groter dan 0?
Want dan kunnen mensen die de cookie met de "al gestemt waarde" op 0 houden toch stemmen, aangezien dan de $validVote waarde gereset wordt.
(tenzij ik het verkeerd gezien heb overigens).

Ow, klopt niet.

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 02-09 00:01

BierPul

2 koffie graag

Gewoon usr_id loggen lijkt me :P

Ja man


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 21:27

pietje63

RTFM

als je alleen user id logged kunnen mensen meerdere user id's aanmaken he :D

ok. ik heb niet hele script gelezen maar volgende dingen kun je gebruiken voor beveiliging

*ip
*http_referrer (of er niet via andere site wordt gestemd)
*user
*cookies (alleen wordt niet iedereen daar blij mee)

deze combinatie zal heel wat helpen
(als je nog inbelmodem hebt, opnieuwe inbellen, cookies verwijderen en onder andere naam registreren kan dan nog, maarja, je kunt niet ALLES beveiligen)

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als je een site hebt waar users plaatjes als input kunnen leveren (zoals de webicons hier) dan zou ik een check erbij doen op REQUEST_METHOD="POST".
Dat is nl. de makkelijkste manier voor manipulatie.

Who is John Galt?


  • wiho
  • Registratie: Februari 2000
  • Laatst online: 31-08 20:01

wiho

Certified Nerd

Uit je code maak ik op dat je twee methodes gebruikt om te controleren of iemand al eerder op een bepaald poll gestemd heeft (overigens mag je je code wel iets meer van commentaar voorzien :)).

Bij de tweede methode zet je een cookie. Cheaters kunnen die check makkelijk omzeilen door cookies te wissen, of te weigeren. Ik neem aan dat je dat zelf ook al bedacht had. ;)

De eerste methode is wat complexer. Zo te zien log je de IP-adressen van voters om controleren wie er al gestemd heeft. Voordat je controleert of een nieuwe stem wordt uitgebracht van een gelogd IP-adres, gooi je eerst alle logs ouder dan een half uur weg, ik neem aan om problemen met proxyservers te voorkomen (meerdere mensen achter 1 IP-adres) ofzo. Tot zover prima.

Vervolgens haal de de overgebleven logs voor de desbetreffende poll uit de rate_check table. Maar je controleert alleen van de eerste record of 't gelogde IP-adres overeenkomt met het IP-adres van de voter! Je voert immers maar eenmaal mysql_fetch_row() uit. De overige logs worden niet bekeken. Tsja, dan is 't niet zo moeilijk om meerdere malen te stemmen, he? :P

Oplossing is dus om een loopje om de IP-check te zetten waarmee je alle geretourneerde records afgaat.

Twee opmerkingen:
1. De check ($pid == $pids) is overbodig, omdat je in je query alleen om records met de juiste pid vraag (WHERE pid=$pid).

2. Zet het IP-adres van de voter ook in de query. Je hoeft dan alleen nog maar te checken of er een record gevonden wordt. Dus:
PHP:
1
<?...$result = mysql_query("SELECT ip, pid FROM $prefix"._gallery_rate_check." WHERE pid=$pid AND ip='$ip'");if (mysql_num_rows($result) > 0) {$voteValid = 0;} else {...?>

"Pas als het proces gecrashed is, dumpt men de core"


Verwijderd

Topicstarter
Hee verrek,

dus hij controleerd alleen maar het eerste veld aha

Maar hoe bedoel je nu zo "loopje" ?

thanx

  • wiho
  • Registratie: Februari 2000
  • Laatst online: 31-08 20:01

wiho

Certified Nerd

Als je de voorbeeld-code uit m'n vorige post toepast, hoef je helemaal geen loopje meer te gebruiken. Die opmerking over een loopje sloeg alleen op je huidige code, maar dat zou een inefficiente oplossing zijn.

"Pas als het proces gecrashed is, dumpt men de core"


Verwijderd

Topicstarter
Thanx,

Je bent geweldig ;-)

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 23-08 12:03

[ash]

Cookies :9

Je zal op UserID moeten loggen, loggen op IP levert het probleem op dat maar 1 user van de tig proxy-user bij een bedrijf de poll kan invullen. En dat wil je ook nie.

Het gebruik van cookies garandeert helemaal niets, je kan je cookie altijd verwijderen c.q. aanpassen.

Succes
Pagina: 1