Ik kon even geen betere titel verzinnen, dus alvast excuses.

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:


<?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.");
}


}
} 
}
?>

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.
Je kan $_SERVER['REMOTE_ADDR'] manipuleren geloof ik.
Daarnaast, wat nog gevaarlijker is SQL injection is mogelijk. je $_GET['id'] en $_SERVER['REMOTE_ADDR'] wordt niet geescaped. :-)
$_GET['id'] wordt niet geescaped omdat er verderop al gecontroleerd wordt of het daadwerkelijk een INT is. maar ik zal het voor de zekerheid even bijwerken.


Jan Koehoorn postte een tijd terug ergens in een stoffig topic uit 2004 dit script:

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;
}

Kan ik er vanuitgaan dat dit nog steeds werkt (Php 5.3 als ik mij niet vergis) en veilig is?
Ja die is ansich goed. Je zou opzich nog kunnen controleren of het geen lokale IP adressen zijn.

Dus een OR in de $_SERVER['HTTP_X_FORWARDED_FOR'];

<?php

!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! :-)
Als spam blijft komen dan kan je het beste eens naar http://akismet.com/ kijken. Houdt al zo goed als een jaar mijn gastenboek geheel spamvrij terwijl het ervoor letterlijk ondergespamt werd.
Ik heb gisteravond de Api van Project Honeypot en van Stopforumspam.com in ieder geval geïntegreerd, wat tot nog toe prima lijkt te werken. mocht er alsnog spam tevoorschijn komen dan zal ik Akismet ook even proberen.

in ieder geval bedankt voor je reactie.

Reageren