Toon posts:

[PHP] Cookie check (poll)

Pagina: 1
Acties:
  • 61 views sinds 30-01-2008

Verwijderd

Topicstarter
In een populaire site maak ik gebruik van een multi-optional poll. Deze dient als stemfunctie, waarbij uit een lijst van 30 items maximaal 5 items geselecteerd mogen worden.
Elke week wordt de lijst aangepast, een bezoeker mag dus maar 1x per week stemmen.
Om misbruik tegen te gaan (continue blijven stemmen) zijn er meerdere opties beschikbaar:

1. een cookie, die met if (isset) { wordt gechecked.
2. ip-registratie
3. activatie van een 'vote' dmv email

Ik maak gebruik van een ietwat verouderd voting-script, genaamd: tapps multipoll

Het probleem:
Op de test-server werkt het gebruik van cookies prima, en is het dus niet mogelijk om meer dan 1 keer te stemmen. _/-\o_
Echter als ik het spul 'live' zet op de server ( http://www.kidstop20.nl/?stempage ) wordt het hele cookieverhaal kennelijk niet verwerkt. Het is mogelijk om onbeperkt te stemmen. |:(

Het script werkt in principe zo:
Na een form-submit wordt gekeken of een aantal variabelen gedefinieerd is. Aan de hand van die var's/strings/arrays wordt bepaald welke 'beveiliging' actief is; als er een cookie bestaat, wordt de gebruiker gewaarschuwd. Bestaat het cookie nog niet, wordt er in de tabel 'pending_votes' een tijdelijke record aangemaakt met een md5-ID. Zodra het cookie is geactiveerd en er verder geen opties doorlopen moeten worden, wordt de pending vote geactiveerd aan de hand van het md5-ID.

Het script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// does the vote
function do_vote($poll_id,$options)
{
    global $HTTP_SERVER_VARS;
    global $tapps_cookie, $tapps_cookie_name, $tapps_cookie_force;
    global $tapps_email_confirmation, $tapps_email_confirmation_from, $tapps_email_locking;
    global $already_voted, $voter_email;

    $url = "";
    // cookie
    if (isset($tapps_cookie) && $tapps_cookie==TRUE)
    {
        array_push($already_voted, $poll_id);
        $cookie_value = serialize($already_voted);
        setcookie("$tapps_cookie_name","$cookie_value",time()+518400);
        // if we force the user to accpet the cookie then create a pending vote
        // and redirect to that url
        if (isset($tapps_cookie_force) && $tapps_cookie_force==TRUE)
        {
            $db_value = serialize($options);
            $id = md5(uniqid(rand()));
            db_query("INSERT INTO tapps_pending (id,poll_id,options) VALUES('$id',$poll_id,'$db_value')");
            $url = "http://www.kidstop20.nl/multipoll/poll.php?mode=activate&pending_id=$id";

            // don't redirect now if we have email confirmation enabled (handled later)
            if (isset($tapps_email_confirmation)==FALSE || $tapps_email_confirmation!=TRUE ||
                isset($voter_email)==FALSE || $voter_email == "")
            {
                header("Location: $url");
                echo "<html><body>";
                echo "<br><br><strong>Bedankt voor je stem!</strong><br><br>Je stem is geteld.<br><br><a href=\"poll.php\" target=\"_self\">Terug</a>\n";
                echo "</body></html>";
                exit;
            }
        }
    }


    if (isset($tapps_email_confirmation) && $tapps_email_confirmation==TRUE &&
        isset($voter_email) && $voter_email!="")
    {
        // when there is no pending vote yet then create one
        if ($url == "")
        {
            $db_value = serialize($options);
            $id = md5(uniqid(rand()));
            db_query("INSERT INTO tapps_pending (id,poll_id,options) VALUES('$id',$poll_id,'$db_value')");
            $url = "http://".$HTTP_SERVER_VARS['HTTP_HOST'].$HTTP_SERVER_VARS['PHP_SELF']."?mode=activate&pending_id=$id";
        }
        mail($voter_email,"Poll confirmation",
            "To activate your vote please go to the following URL\n".
            "$url\n",
            "From: $tapps_email_confirmation_from");
        echo "Emailed $voter_email for confirmation.<br>\n";
        // lock email
        if (isset($tapps_email_locking) && $tapps_email_locking==TRUE)
        {
            db_query("INSERT INTO tapps_emaillocks (poll_id,email) VALUES($poll_id,'$voter_email')");
        }
        exit;
    }

    // if nothing else hen immediatly count the vote
    count_vote($poll_id,$options);
}


en:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// activates a pending vote
function activate_vote($pending_id)
{
    global $tapps_pending_timeout;
    global $already_voted;


    if (isset($tapps_pending_timeout) && $tapps_pending_timeout>0)
    {
        $i = time() - $tapps_pending_timeout;
        db_query("DELETE FROM tapps_pending WHERE UNIX_TIMESTAMP(timestamp) < $i");
    }

    $result = db_query("SELECT poll_id,options FROM tapps_pending WHERE id='$pending_id'");
    $o = db_fetch_object($result);
    if (is_object($o) && isset($o->poll_id) && isset($o->options))
    {
        db_query("DELETE FROM tapps_pending WHERE id='$pending_id'");
        if ((isset($already_voted)) && (in_array($o->poll_id, $already_voted)))
        {
            $options = array();
            $options = unserialize($o->options);
            count_vote($o->poll_id,$options);
        } else
        {
            die("You must accept cookies (or this particular cookie) to be able to vote.<br>\n");
        }
    } else
    {
        die("Invalid pending vote.<br>(Don't mess with the input. I don't trust you!)<br>\n");
    }
}


en:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// checks if a vote is allowed
function check_vote($poll_id, $options)
{
    global $HTTP_SERVER_VARS;
    global $tapps_referer;
    global $tapps_ip_locking, $tapps_ip_locking_timeout;
    global $tapps_cookie, $tapps_cookie_name, $tapps_cookie_force;
    global $tapps_email_confirmation, $tapps_email_locking, $tapps_email_locking_timeout;
    global $already_voted, $voter_email;

    $result = db_query("SELECT * FROM tapps_polls WHERE poll_id=$poll_id");
    $poll = db_fetch_object($result);


    // referer check
    if (isset($tapps_referer) && $tapps_referer!="")
    {
        $referer=$HTTP_SERVER_VARS['HTTP_REFERER'];
        if ($i=strpos($referer,"?"))
        {
            $referer= substr($referer,0,$i);
        }
        if ($tapps_referer != $referer)
        {
            die("Go whence you came!<br>(a.k.a. \"Bad referer\")<br>\n");
        }
    }

    // valid number of options?
    if (sizeof($options) > $poll->max_answers)
    {
        die("<strong>Pas op</strong>, je mag maximaal op $poll->max_answers items stemmen...<br>\n");
    }
    if (sizeof($options) > sizeof(array_unique($options)))
    {
        die("You are only allowed to vote once for each option.<br>(Strange... how did you do that?!?)<br>\n");
    }


    // ip locking
    if (isset($tapps_ip_locking) && $tapps_ip_locking==TRUE)
    {
        if (isset($tapps_ip_locking_timeout) && $tapps_ip_locking_timeout>0)
        {
            $i = time() - $tapps_ip_locking_timeout;
            db_query("DELETE FROM tapps_iplocks WHERE UNIX_TIMESTAMP(timestamp) < $i");
        }
        $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];

        $result = db_query("SELECT COUNT(*) AS locked FROM tapps_iplocks WHERE poll_id=$poll_id AND ip='$ip'");
        $o = db_fetch_object($result);
        if ($o->locked > 0)
        {
            die("<br><br><br><strong<Je hebt al een keer gestemd, je kunt één keer per week stemmen!</strong><br>\n");
        }
    }

    // cookie check
    if (isset($tapps_cookie) && $tapps_cookie==TRUE)
    {
        if (in_array($poll_id, $already_voted))
        {
            die("<br><br><br><strong>Je hebt al gestemd op de Kids Top 20!<br> Je mag één keer per week je stem uit brengen</strong><br>\n");
        }
    }

    // email ok
    if (isset($tapps_email_confirmation) && $tapps_email_confirmation==TRUE)
    {
        if (eregi("^[_\.0-9a-z-]+@([0-9a-z][-0-9a-z\.]+)\.([a-z][a-z]+$)",$voter_email) == FALSE)
        {
            die("Invalid email address.<br>\n");
        }

        // email locking
        if (isset($tapps_email_locking) && $tapps_email_locking==TRUE)
        {
            if (isset($tapps_email_locking_timeout) && $tapps_email_locking_timeout>0)
            {
                $i = time() - $tapps_email_locking_timeout;
                db_query("DELETE FROM tapps_emaillocks WHERE UNIX_TIMESTAMP(timestamp) < $i");
            }

            $result = db_query("SELECT COUNT(*) AS locked FROM tapps_emaillocks WHERE poll_id=$poll_id AND email='$voter_email'");
            $o = db_fetch_object($result);
            if ($o->locked > 0)
            {
                die("You (or someone else using your Email-address) already voted for this poll recently.<br>\n");
            }
        }
    }
}


Kan dit probleem liggen aan het feit dat de test-server een andere versie van PHP heeft draaien dan de live-server?
Check: http://server1.firstfind.nl (= live server)
Ligt het aan een verkeerde verwerking van het md5-encryption principe?

Wie kan hier even naar kijken en mij helpen met evt. een mogelijke oplossing?


Dank!

Mathijs

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Ik heb niet echt veel zin om al die code door te gaan lezen

Welke PHP versie staat op beide servers?

Je gebruikt wel erg veel deprecated stuff in je code (HTTP_POST_VARS), misschien dat het daar aan ligt? $_COOKIE zie ik bijvoorbeeld ook nergens.

Heb je al gecheckt of je cookie uberhaupt geset wordt, en if so, wat er dan in staat? Als dat allemaal werkt, dan zou ik pas naar het behandelen van de cookie vars in je script gaan kijken.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Verwijderd

Topicstarter
ehm sorry, er is een config_inc.php file waar de cookie settings (naam, TRUE) worden gedefinieerd.
Op de test-server werkt het allemaal prima, maar op de live-server niet.

PHP versies:
@ test-server: PHP Version 5.0.3
@ live-server: PHP Version 4.4.0-0.dotdeb.0

[deel van config_inc]
// Set whether you want to set a cookie for a user who voted. This helps to
// minimize the possibility for users to vote more than once for the same poll.
// Comment out or set to FALSE if you don't want this.
$tapps_cookie=TRUE;

// Name of the cookie which is set when you have cookies enabled (see above).
// Must be set if $tapps_cookie is TRUE.
$tapps_cookie_name="KT20STEM";

// Set whether accepting the above cookie is optional (FALSE) or mandatory
// (TRUE). Some browsers ask the user and don't set a cookie automatically.
// Comment out or set to FALSE if you don't want this.
$tapps_cookie_force=TRUE;

[ Voor 56% gewijzigd door Verwijderd op 23-08-2005 12:47 ]


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Misschien ligt het eraan dat je het domein niet mee stuurt in je setcookie aanroep?

Maar zoals gezegd: wordft je cookie wel gezet, en if so wat staat erin? Staat erin wat je wilt? Als niet: debuggen, als wel: debuggen. ;)

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Verwijderd

Topicstarter
Cavorka schreef op dinsdag 23 augustus 2005 @ 13:03:
Misschien ligt het eraan dat je het domein niet mee stuurt in je setcookie aanroep?

Maar zoals gezegd: wordft je cookie wel gezet, en if so wat staat erin? Staat erin wat je wilt? Als niet: debuggen, als wel: debuggen. ;)
Op de test-server wordt het cookie geset:
code:
1
2
3
4
5
6
7
8
9
KT20STEM
a%3A1%3A%7Bi%3A0%3Bi%3A3%3B%7D
62.166.135.116/kt20.nl/multipoll/
1024
2469248768
29731967
2647895040
29730760
*


In het cookie wordt het domein meegestuurd.

In de map cookies op mn pc vind ik nergens een cookie dat geset is op de live-server. Er wordt daar dus géén cookie aangemaakt, blijkt. Hoe dit op te lossen??

Ik ben geen PHP professional
, dus debuggen gaat niet op voor mij. Daarom post ik de vraag ook hier om te zien of men er wijzer uit wordt.

Dank alvast

[ Voor 11% gewijzigd door Verwijderd op 23-08-2005 13:10 ]


Verwijderd

Topicstarter
Cavorka schreef op dinsdag 23 augustus 2005 @ 13:03:
Misschien ligt het eraan dat je het domein niet mee stuurt in je setcookie aanroep?
array_push($already_voted, $poll_id);
$cookie_value = serialize($already_voted);
setcookie("$tapps_cookie_name","$cookie_value",time()+518400);

Hoe kun je een domein meesturen in de setcookie functie? Is mij niet bekend dat dat kon...

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 01-05 17:46

MBV

en op de live-server? wordt daar het cookie geset? Als dat zo is, kan je je beperken tot het uitlezen van de cookie, wat betekent dat je de startpost dramatisch kan inkorten. Nu is het te lang om 'even snel' te zoeken op fouten.

En by the way, dat ruikt wel naar script-request etc, waar we hier niet aan doen...

Evt ben ik nog op zoek naar een baantje, mocht je er niet uitkomen :P

edit:
Ook al ben je geen PHP-professional, je mag toch op z'n minst in de manual kijken als iets voorgesteld wordt wat je niet kent? http://nl3.php.net/setcookie :O

[ Voor 20% gewijzigd door MBV op 23-08-2005 13:17 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 23 augustus 2005 @ 13:09:
Ik ben geen PHP professional, dus debuggen gaat niet op voor mij. Daarom post ik de vraag ook hier om te zien of men er wijzer uit wordt.
Debuggen gaat ook op voor amateurs en hobbyisten. Als je zelf je eigen code niet kan debuggen, dan kun je dat maar beter snel leren of overwegen te stoppen met programmeren, want zonder debuggen krijg je nooit een fatsoenlijk programma of script uit je vingers. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
MBV schreef op dinsdag 23 augustus 2005 @ 13:14:
en op de live-server? wordt daar het cookie geset? Als dat zo is, kan je je beperken tot het uitlezen van de cookie, wat betekent dat je de startpost dramatisch kan inkorten. Nu is het te lang om 'even snel' te zoeken op fouten.

En by the way, dat ruikt wel naar script-request etc, waar we hier niet aan doen...

Evt ben ik nog op zoek naar een baantje, mocht je er niet uitkomen :P
Zoals gezegd: op de live-server wordt er kennelijk géén cookie geset (althans: niet te vinden in de cookies map, terwijl de cookie geset op de test-server wil te vinden is daar).

En by the way: Ik vraag niet om een script-request, zoals in mijn 1e post te lezen is stel ik vragen over de aard van het probleem. Ik vraag me af of MD5-ID of cookie verwerking zo wel werkt als in het script staat.

Verwijderd

Topicstarter
-NMe- schreef op dinsdag 23 augustus 2005 @ 13:17:
[...]

Debuggen gaat ook op voor amateurs en hobbyisten. Als je zelf je eigen code niet kan debuggen, dan kun je dat maar beter snel leren of overwegen te stoppen met programmeren, want zonder debuggen krijg je nooit een fatsoenlijk programma of script uit je vingers. ;)
Sure. Neemt niet weg dat ik mijn vraag toch gewoon mag stellen op dit zo behulpzame forum, niet?

Verwijderd

Topicstarter
MBV schreef op dinsdag 23 augustus 2005 @ 13:14:

edit:
Ook al ben je geen PHP-professional, je mag toch op z'n minst in de manual kijken als iets voorgesteld wordt wat je niet kent? http://nl3.php.net/setcookie :O
ok, (niet lachen): in mijn boek 'PHP & MySQL voor Dummies (php5 en mysql4)' staat niets over het meesturen van een domein met setcookie. Er staan veel voorbeelden in over cookie verwerking, maar niets over het meezenden van een domein.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 01-05 17:46

MBV

die 3 reacties hadden ook in een bericht gepast, lijkt mij zo.

Ok, ik ga behulpzaam zijn. Ik begin met wat vragen stellen om jouw de goede richting uit te krijgen.
  • Op PHP5 werkt het dus wel, op PHP4.* niet. Wordt er in jouw script gebruik gemaakt van dingen die in PHP5 anders werken dan in PHP4? Daar zitten namelijk drastische verschillen tussen...
  • Heb je het script zelf geschreven? Zo nee: kan je ergens voor support aankloppen?
  • zet die set_cookie() aanroep eens in een die-statement:
    code:
    1
    
    die("set_cookie geeft terug: ".set_cookie(.......));
    Als hier een 1 komt te staan, dan werkt set_cookie. Dit is de eerste stap met debuggen
  • Zegt je browser dat er een cookie is geset? Je kan in bijna elke browser kijken wat de inhoud is van je cookies, dat hoef je niet op je server te doen
  • Ik heb geen tijd om door de spagetti heen te kijken, maar waar wordt de check gedaan of je cookie geset is? Als je dat even aanwijst kan ik je misschien verder helpen

Verwijderd

Topicstarter
Op PHP5 werkt het dus wel, op PHP4.* niet. Wordt er in jouw script gebruik gemaakt van dingen die in PHP5 anders werken dan in PHP4? Daar zitten namelijk drastische verschillen tussen...--
op beide servers (php.ini) staan register globals ON en safe mode OFF
Aangezien het hier gaat om een best wel verouderd script (2002, tapps multipoll), vind ik het merkwaardig dat het in PHP5 wél werkt, en in PHP4.40 niet...

Heb je het script zelf geschreven? Zo nee: kan je ergens voor support aankloppen? --
Nee, niet zelf geschreven. Heb wel al de oorspronkelijke auteur gemaild, maar tot nog toe geen reactie.... ook helaas geen forum of andere dev-resources beschikbaar voor dat script...

zet die set_cookie() aanroep eens in een die-statement:[code]die("set_cookie geeft terug: ".set_cookie(.......));[/code]Als hier een 1 komt te staan, dan werkt set_cookie. Dit is de eerste stap met debuggen--
(is het niet setcookie ipv set_cookie?)
output van de browser:
code:
1
set_cookie geeft terug:


Zegt je browser dat er een cookie is geset? Je kan in bijna elke browser kijken wat de inhoud is van je cookies, dat hoef je niet op je server te doen--
Gedaan: op de test-server wordt het cookie geset (inhoud heb ik in een eerdere post geplaatst), op de live-server wordt het cookie niet geset. (mn browser accepteert alle cookies, IE6).

Ik heb geen tijd om door de spagetti heen te kijken, maar waar wordt de check gedaan of je cookie geset is? Als je dat even aanwijst kan ik je misschien verder helpen--
Ja in t script wordt dat gedaan, zie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// cookie check
    if (isset($tapps_cookie) && $tapps_cookie==TRUE)
    {
        if (in_array($poll_id, $already_voted))
        {
            die("<br><br><br><strong>Je hebt al gestemd op de Kids Top 20!<br> Je mag één keer per week je stem uit brengen</strong><br>\n");
        }
    }

...
    // cookie
    if (isset($tapps_cookie) && $tapps_cookie==TRUE)
    {
        array_push($already_voted, $poll_id);
        $cookie_value = serialize($already_voted);
        setcookie("$tapps_cookie_name","$cookie_value",time()+518400);
        // if we force the user to accpet the cookie then create a pending vote
        // and redirect to that url
        if (isset($tapps_cookie_force) && $tapps_cookie_force==TRUE)
        {
            $db_value = serialize($options);
            $id = md5(uniqid(rand()));
            db_query("INSERT INTO tapps_pending (id,poll_id,options) VALUES('$id',$poll_id,'$db_value')");
            $url = "http://www.kidstop20.nl/multipoll/poll.php?mode=activate&pending_id=$id";


hoop dat eea zo duidelijk uitgelegd is, iig alvast dank voor je hulp!

[ Voor 11% gewijzigd door Verwijderd op 23-08-2005 14:07 ]


Verwijderd

Wat dacht je van verschillende instellingen van je browser voor lokaal en niet lokaal werken. Blijkbaar is de policy bij het bezoek op websites zo dat er geen cookie geset mag worden. Nu is vermoedelijk je software niet zo intelligent om dat te checken: ofwel: je mag bijven stemmen, want er kan geen cookie geset worden. Loop je cookie instelling maar eens na...

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 23 augustus 2005 @ 14:08:
Wat dacht je van verschillende instellingen van je browser voor lokaal en niet lokaal werken. Blijkbaar is de policy bij het bezoek op websites zo dat er geen cookie geset mag worden. Nu is vermoedelijk je software niet zo intelligent om dat te checken: ofwel: je mag bijven stemmen, want er kan geen cookie geset worden. Loop je cookie instelling maar eens na...
dank voor je suggestie, maar dat had ik reeds gedaan:
zie mn vorige post: "(mn browser accepteert alle cookies, IE6)."

wellicht is het idd handiger om op IP-toegang te beheersen? Werkt ook niet op de live-server...

[ Voor 9% gewijzigd door Verwijderd op 23-08-2005 14:13 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Nee, niet zelf geschreven. Heb wel al de oorspronkelijke auteur gemaild, maar tot nog toe geen reactie.... ook helaas geen forum of andere dev-resources beschikbaar voor dat script...
Tsja, toch zit je ook hier dan verkeerd. We geven in Programming & Webscripting geen support op scripts van anderen; het gaat hier over zelf programmeren. Als een script van een ander niet werkt zoals jij wil kun je contact opnemen met de maker, of als dat niet kan, zoals in jouw geval blijkbaar het geval is, dan kun je beter een ander script zoeken of er zelf een schrijven.

Dit script is gewoon hopeloos verouderd en ik zou de moeite niet meer nemen het te verbeteren. Kies liever een ander. Wij kunnen je verder in elk geval niet meer helpen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.