• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

spam über (kontakt-) formulare verhindern

rasputin

Lounge-Member
dieses tutorial setzt grundlegende kenntnisse über php und sessions voraus.

spammer haben bekanntermassen eine neuere art gefunden um mails zu verschicken: übers kontaktformular.
dies wird mit diesem script unterbunden. gleichzeitig wird ein mehrmaliges verschicken der nachricht durch einen reload verhindert. das ganze funktioniert auch bei deaktivierten cookies beim client.
das ganze funktioniert folgendermassen: beim aufruf der kontaktseite wird eine id generiert, in der session gespeichert und ins formular eingetragen (hidden). vor dem versenden des mails wird nun geprüft, (1) ist eine id in der session gespeichert, (2) ob eine id übermittelt wurde, (3) ist die übermittelte id diejenige, die vorher gespeichert wurde. wenn alle drei bedingungen zutreffen, wird das mail verschickt.

PHP:
$danke = "";
$error = "";

if (isset($_POST['contactform_antispam']) && isset($_SESSION['contactform_antispam']) && $_SESSION['contactform_antispam'] == $_POST['contactform_antispam']) {
	if ($name == "") { 
		$error = "<p><strong>Sie haben Ihren Namen nicht angegeben.</strong></p>";
	} elseif (strpos($email, "@") === false) {
		$error = "<p><strong>Bitte geben Sie eine gültige Email-Adresse an.</strong></p>";
	} elseif ($bemerkung == "") {
		$error = "<p><strong>Bitte schreiben Sie eine Nachricht.</strong></p>";
	} else { // alles korrekt
		require_once "./_include/emails.php";
		eval("\$message = \"{$_email['kontakt']['message']}\";");
		mail(...);
		$danke = "<p><strong>Vielen Dank für Ihr Feedback!</strong></p>";
	}
} elseif (isset($_POST['kontakt_bemerkung'])) {
	// spam abfangen, ip an mich übermitteln
	mail(...);
}

$_SESSION['contactform_antispam'] = md5(time().$_SERVER['REMOTE_ADDR']); // hash speichern bei jedem aufruf der seite

/****************************************************/
// im formular weiter unten
<?php
echo $danke, $error;
echo '<input type="hidden" name="contactform_antispam" value="'.$_SESSION['contactform_antispam'].'" /> <input type="hidden" name="'.session_name().'" value="'.session_id().'" />';
?>
 
Zuletzt bearbeitet:
Sieht gut aus!
Werde mal versuchen, das in mein bestehendes Form reinzubasteln,
denn mich betrifft das leider momentan...
 
würde was dagegen sprechen, keine Sessions zuverwenden, sondern direkt eine zufällige Zahl in ein Hiddeninput zuschreiben?
 
ZeitGeist schrieb:
würde was dagegen sprechen, keine Sessions zuverwenden, sondern direkt eine zufällige Zahl in ein Hiddeninput zuschreiben?
eigentlich nichts, wenn diese zufällige zahl irgendwie überprüft/entschlüsselt werden kann. allerdings funktioniert meine variante bestens, auf dem client müssen nicht mal cookies angenommen werden.
 
rasputin schrieb:
spammer haben bekanntermassen eine neuere art gefunden um mails zu verschicken: übers kontaktformular. dies wird mit diesem script unterbunden.
genau so etwas brauche ich (leider)... Problem ist nur, dass mein Kontaktformular aus zwei Dateien besteht... einmal eine html Seite in der die Dateieingabe erfolgt und eine zweite php Seite, in der die Auswertung der Daten bzw. das Abschicken stattfindet...

Meine Kenntnisse in php sind nicht gerade die besten, deshalb die Frage: kann mir jemand evtl. ein Beispiel posten, wie / wo ich das Script einbauen / anpassen muß? Danke im voraus!
 
Black Panther schrieb:
Problem ist nur, dass mein Kontaktformular aus zwei Dateien besteht... einmal eine html Seite in der die Dateieingabe erfolgt und eine zweite php Seite, in der die Auswertung der Daten bzw. das Abschicken stattfindet..
versuchs mal so:
PHP:
/* FORMULAR */
session_start(); // muss vor der ersten ausgabe aufgerufen werden!
$_SESSION['contactform_antispam'] = md5(time().$_SERVER['REMOTE_ADDR']);

// im formular folgendes feld einfügen
echo '<input type="hidden" name="contactform_antispam" value="'.$_SESSION['contactform_antispam'].'" /> <input type="hidden" name="'.session_name().'" value="'.session_id().'" />'; 


/* AUSWERTUNG */
// vor dem verschicken diese if-abfrage überfrüfen
if (isset($_POST['contactform_antispam']) && isset($_SESSION['contactform_antispam']) && $_SESSION['contactform_antispam'] == $_POST['contactform_antispam']) { 
   .......
}
wichtig: es müssen beides php-dateien sein.
 
Hallo,

puh, war schwer diesen Thread zu finden. Aber ich will ihn nochmal reaktivieren, da ich auch das Prob habe mit einem Kontaktformula. Habe auch eine versenden.php, mit dem Skript und das Kontakt.php mit den Formular. Habe alles schön eingebaut, wie Rasputin es Black Panther erklärt hat eine Fehlermeldung bekomme ich nicht. Aber das will ja nichts heißen. Kann nochmal jemand drübergucken? Ich bin ein kleiner PHP-Laie, baue mir eben es so gut die Sachen zusammen, zum selber Programmieren reicht es (noch) nicht...:))


Danke!


Kontakt.php (Ausschnitt)

<META name="ROBOTS" content="all">
<meta http-equiv="expires" content="0">
<link rel="stylesheet" href="extern/styles-a.css" type="text/css">
</head>
<body bgcolor="#d9d780">
session_start(); // muss vor der ersten ausgabe aufgerufen werden!
$_SESSION['contactform_antispam'] = md5(time().$_SERVER['REMOTE_ADDR']);

<a name="top"></a>
<SCRIPT>/*
* DHTML Menu version 3.3.19
.........
.
.
.
..
<textarea name="sonstiges" cols="50"></textarea>
</td>
</tr>
<tr>
<td> </td>
<td>
<p> </p>

<input type="hidden" name="contactform_antispam" value="'.$_SESSION['contactform_antispam'].'" /> <input type="hidden" name="'.session_name().'" value="'.session_id().'" />
<p> </p>
</td>
</tr>
<tr>
<td> </td>
<td>
<input type="submit" name="Abschicken" value="Abschicken">
</td>
</tr>




Und versenden.php: (ausschnitt)

.....
<p><span class="mini">Sie befinden sich hier:</span><br>
<a href="index.php">Home</a> >> <b>Kontakt</b><b> -</b> <br>
<br>
</p>
<?
if (isset($_POST['contactform_antispam']) && isset($_SESSION['contactform_antispam']) && $_SESSION['contactform_antispam'] == $_POST['contactform_antispam']) {
}
$vorname= $_REQUEST["vorname"];
$name= $_REQUEST["name"];
$strasse= $_REQUEST["strasse"];
$plz= $_REQUEST["plz"];
$wohnort= $_REQUEST["ort"];
$email= $_REQUEST["email"];
$telefonnummer= $_REQUEST["telefonnummer"];
$welcher_Tag= $_REQUEST["welcher_Tag"];
$sonstiges=$_REQUEST["sonstiges"];

$empfaenger = "XXXXXX";
$absender = $email;
$betreff = "XXXXXXXX";

mail($empfaenger,$betreff,"

Vorname: $vorname
Name: $name
Strasse: $strasse
Ort: $plz $wohnort
Mailadresse: $email
Telefonnummer: $telefonnummer
welcher_Tag: $welcher_Tag
sonstiges: $sonstiges

","From: $absender");
.
.
.
 
Zuletzt bearbeitet:
ja bei mir gibt es da auch ein paar probleme..

ersten geht der antispamfilter nicht (der müsste doch funktionieren, wenn ich das beispiel.html und die planetmail.php auf men php-fähigen server hab oder?? .. und ach ja, eine danke.html hab ich natürlich auch)

und zweitens müsste ich an der stelle

$send_dat = array(
"dat1" => array("xxxx@yyy.zz", "", "Anfrage über das Kontaktformular", "/danke.html"),
);


wo das xxxx@yyy.zz ist irgendwie eine abfrage reinbekommen...

also ich hab in der beispiel.html eine select-option, weil ich an unterschiedliche personen die mail verschicken muss...

wie geht das, das sie dann an unterschiedliche adressen gesendet wird?

die felder müssen auch nicht ausgefüllt werden...
kann also auch komplett leere mails versenden.

und eine e-mailadresse 123...

wär gut, wenn man da eine adresse nach demm muster xxxxx@yyy.zz einfügen müsste andernfals eine fehlermeldung kommt

ich weiß nicht wo ich das einfügen muss aber das geht doch mit:

if(!ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$",$email))
{
echo "Fehlerhafte E-mail!";
}


oder?

vielen dank schon mal.. komm echt nicht weiter
 
Zurück
Oben