Anti-spammaatregelen "werken niet"
Ik zal even globaal vertellen wat ik probeer te bereiken. Ik ben nu bezig met een script wat aan de hand van gegevens controleert of een bericht spam is, of juist niet. ik word behoorlijk geteisterd door spambots, dus ik wil het graag goed doen. nu gebeurt het volgende:
Code (php)
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
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
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
#formulier is gezet..
echo "<br />\n<br />\n<h2>";
if(!checkemail($_POST['email'])) { #maakt verbinding met mx server en valideert het adres
echo logaction("U heeft geen geldig emailadres ingevoerd. Laat het veld leeg of gebruik een geldig emailadres.");
} else {
if(empty($_POST['naam']) || empty($_POST['message'])) {
echo logaction("U heeft geen geldige naam of een geldig bericht ingevoerd.");
} else {
if(!isset($_POST['showemail'])) {
$_POST['showemail'] = 0;
} else {
$_POST['showemail'] = 1;
}
if(page_exists($_POST['website'])) { #maakt verbinding met de website
$ipadr = trim($_SERVER['REMOTE_ADDR']);
if(strlen($ipadr) > 8) { #ip adres met >8 tekens = ok
if(empty($_POST['confirmemail'])) { #boobytrap voor spambots: gebruikers krijgen dit veld nooit te zien dankzei javascript
$sql = "
INSERT INTO
reacties
(nieuws_id, naam, email, bericht, showemail, website, datum, ip)
values
(
'".$_GET['id']."',
'".mysql_real_escape_string($_POST['naam'])."',
'".mysql_real_escape_string($_POST['email'])."',
'".mysql_real_escape_string($_POST['message'])."',
'".mysql_real_escape_string($_POST['showemail'])."',
'".mysql_real_escape_string($_POST['website'])."',
NOW(),
'".$_SERVER['REMOTE_ADDR']."'
)
";
$query2 = mysql_query($sql);
if($query2) {
echo "Het plaatsen is gelukt! U word teruggestuurd naar de vorige pagina.
<script type=\"text/javascript\">
window.location = \"/\"
</script>";
}
} else {
echo logaction("uit veiligheidsoverweging kan het bericht niet geplaatst worden. excuses voor het ongemak. code 1: Project Honeypot.");
}
} else {
echo logaction("uit veiligheidsoverweging kan het bericht niet geplaatst worden. excuses voor het ongemak. code 2: Geen toegang tot gegevens.");
}
} else {
echo logaction("De ingevoerde website bestaat niet.");
}
}
}
}
?>
if($_SERVER['REQUEST_METHOD'] == 'POST') {
#formulier is gezet..
echo "<br />\n<br />\n<h2>";
if(!checkemail($_POST['email'])) { #maakt verbinding met mx server en valideert het adres
echo logaction("U heeft geen geldig emailadres ingevoerd. Laat het veld leeg of gebruik een geldig emailadres.");
} else {
if(empty($_POST['naam']) || empty($_POST['message'])) {
echo logaction("U heeft geen geldige naam of een geldig bericht ingevoerd.");
} else {
if(!isset($_POST['showemail'])) {
$_POST['showemail'] = 0;
} else {
$_POST['showemail'] = 1;
}
if(page_exists($_POST['website'])) { #maakt verbinding met de website
$ipadr = trim($_SERVER['REMOTE_ADDR']);
if(strlen($ipadr) > 8) { #ip adres met >8 tekens = ok
if(empty($_POST['confirmemail'])) { #boobytrap voor spambots: gebruikers krijgen dit veld nooit te zien dankzei javascript
$sql = "
INSERT INTO
reacties
(nieuws_id, naam, email, bericht, showemail, website, datum, ip)
values
(
'".$_GET['id']."',
'".mysql_real_escape_string($_POST['naam'])."',
'".mysql_real_escape_string($_POST['email'])."',
'".mysql_real_escape_string($_POST['message'])."',
'".mysql_real_escape_string($_POST['showemail'])."',
'".mysql_real_escape_string($_POST['website'])."',
NOW(),
'".$_SERVER['REMOTE_ADDR']."'
)
";
$query2 = mysql_query($sql);
if($query2) {
echo "Het plaatsen is gelukt! U word teruggestuurd naar de vorige pagina.
<script type=\"text/javascript\">
window.location = \"/\"
</script>";
}
} else {
echo logaction("uit veiligheidsoverweging kan het bericht niet geplaatst worden. excuses voor het ongemak. code 1: Project Honeypot.");
}
} else {
echo logaction("uit veiligheidsoverweging kan het bericht niet geplaatst worden. excuses voor het ongemak. code 2: Geen toegang tot gegevens.");
}
} else {
echo logaction("De ingevoerde website bestaat niet.");
}
}
}
}
?>
Logaction() is een functie die de gegevens in een database zet (ip, datum etc) en de tekst die hij als parameter meekrijgt weer returnd. een omslachtige echo() eigenlijk.
Nu mijn probleem: op het moment dat ik een bericht post komt mijn ip netjes in de database terecht, maar op het moment dat de spambots mijn website betreden en de boel onder spammen, gebeurt er niets (er wordt géén ip adres gepost). ook als er een fout emailadres, een niet bestaande website, niet ingevoerde velden etc worden opgestuurd, het wordt hoe dan ook gepost. bovendien blijft de log database leeg.
mijn vraag is nu, kan het zijn dat spambots geen Ip adres meesturen? of zie ik iets anders over het hoofd?
m.v.g.,
Jens.
Daarnaast, wat nog gevaarlijker is SQL injection is mogelijk. je $_GET['id'] en $_SERVER['REMOTE_ADDR'] wordt niet geescaped. :-)
Gewijzigd op 28/06/2011 19:19:58 door Niels K
Jan Koehoorn postte een tijd terug ergens in een stoffig topic uit 2004 dit script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
function ip() {
if (@getenv ($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = @getenv ($_SERVER['HTTP_X_FORWARDED_FOR']);
}
elseif (@getenv ($_SERVER['HTTP_CLIENT_IP'])) {
$ip = @getenv ($_SERVER['HTTP_CLIENT_IP']);
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
if (@getenv ($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = @getenv ($_SERVER['HTTP_X_FORWARDED_FOR']);
}
elseif (@getenv ($_SERVER['HTTP_CLIENT_IP'])) {
$ip = @getenv ($_SERVER['HTTP_CLIENT_IP']);
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
Kan ik er vanuitgaan dat dit nog steeds werkt (Php 5.3 als ik mij niet vergis) en veilig is?
Gewijzigd op 28/06/2011 19:40:31 door Jens erd
Dus een OR in de $_SERVER['HTTP_X_FORWARDED_FOR'];
Code (php)
1
2
3
2
3
<?php
!preg_match('/^(10\.|127\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|192\.168\.|169\.254\.)/',$_SERVER['HTTP_X_FORWARDED_FOR'])
!preg_match('/^(10\.|127\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|192\.168\.|169\.254\.)/',$_SERVER['HTTP_X_FORWARDED_FOR'])
Ik ga ermee aan de slag. In ieder geval bedankt voor het snelle reageren! :-)
http://akismet.com/ kijken. Houdt al zo goed als een jaar mijn gastenboek geheel spamvrij terwijl het ervoor letterlijk ondergespamt werd.
Als spam blijft komen dan kan je het beste eens naar in ieder geval bedankt voor je reactie.