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.
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:
en:
en:
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
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.
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