Archiv verlassen und diese Seite im Standarddesign anzeigen : Spam-Versand über Kontaktformular (PHP-Skript) verhindern
ericsturm
04.12.2005, 01:17:44
Hallo zusammen,
das unten stehende Skript verwendete ich bisher, um Nachrichten aus meinem Kontaktformular zu versenden.
In letzter Zeit wurde es von Spammern zum Spamversand missbraucht, deswegen habe ich mein Kontaktformular und das Skript von der Seite genommen.
Wer kann mir helfen, das Skript "sicher" zu machen, damit darüber kein Spam mehr versendet werden kann?
Ich kenne mich leider mit PHP nicht besonders gut aus.
Vielen Dank für Eure Hilfe.
Eric Sturm
######## So sah das Mailskript des Kontaktformulars bisher aus: #######
<?php
$fehler =" <!DOCTYPE HTML PUBLIC \-//W3CDTD HTML 4.0 Transitional EN>
<HTML>
<HEAD>
<TITLE>Kontaktformular</TITLE>
<meta http-equiv=\"refresh\" content=\"0; URL=fehlerseite.htm\">
</HEAD>
<BODY></BODY>
</HTML>
";
$TO = "info@internet-fuer-architekten.de";
$DEFAULT_EXIT_PAGE = "dankeseite.php";
$headers = "From: $name on $SERVER_NAME <$mail>\n";
$headers .= "X-Mailer: \n";
$subject .= "";
$message = "";
while (list($key, $val) = each($HTTP_POST_VARS)) {
$message .= "$key : $val\n";
}
$message .= "\nSent by ".gethostbyaddr($REMOTE_ADDR). " ($REMOTE_ADDR)\n";
if (!(eregi ("^.+@.+\\..+$", $email))) {
echo "$fehler";
exit;
}
mail($TO, $subject, $message, $headers);
if(! $exit_page)
$exit_page = $DEFAULT_EXIT_PAGE;
Header("Location: ".$exit_page);
// Exit -> $exit_page
?>
#### Ende PHP-Skript ####
Damir
04.12.2005, 10:17:43
Hi,
ein wenig mehr musst du schon erzaehlen - die Mail geht ja nur an einer Adressse - hat jemand das Skript mehrfach(100,1000,10000......) ausgefuellt und versendet?
Bye Damir
|Coding
04.12.2005, 10:19:10
Leider kannst Du Dich vor Spam nicht wirklich schützen, weil es keine Möglichkeit gibt, Spam von einer normalen Kontaktaufnahme zu unterscheiden.
feuervogel
04.12.2005, 16:03:21
vielleicht ist ja auch das problem hier gemeint:
http://www.traum-projekt.com/forum/19-traum-dynamik/71139-fyi-email-injection.html
aber ohne ausführlichere infos wirds echt schwer...
ericsturm
05.12.2005, 22:40:53
Hallo zusammen,
also, die Beschreibung der "injection-Methode" im Forum von traumprojekt klingt sehr nach dem Problem bei mir.
Der/die Spammer schaffen es, über mein Formular ca. 50-100 Empfängern via bcc Spam-Mails zu senden.
Irgendwie scheinen also meine Variablen/Header "unsicher" zu sein?! Wie gesagt, ich bin ziemlicher PHP-Laie und da absolut überfragt. Weiß jemand Rat bzw. eine sichere Möglichkeit, dieses Skript umzuformulieren?
Grüße
ES
feuervogel
06.12.2005, 00:11:50
die möglichkeiten zur umformulierung werden im thread vom tp genannt, denke ich.
meikel (†)
06.12.2005, 00:51:41
Der/die Spammer schaffen es, über mein Formular ca. 50-100 Empfängern via bcc Spam-Mails zu senden.
Keine Kunst, weil Du ein gutgläubiger Mensch bist und Dein Script aus jedem Mist eine SPAM Mail fertigt.
Irgendwie scheinen also meine Variablen/Header "unsicher" zu sein?!
12.11. Prüfe importierte Parameter. Traue niemandem
http://www.php-faq.de/q/q-sicherheit-parameter.html
schlodd
07.12.2005, 22:03:32
habe auch damit zu kämpfen. Scheint ein wirklich sehr hartnäckiger spammer
zu sein. So wie auf dem TP Hilfe Forum (http://www.traum-projekt.com/forum/19-traum-dynamik/71139-fyi-email-injection.html) steht, handelt es sich um Bots die mit
aller Gewalt ihren spam über Kontaktformulare anderer websites zu versenden.
In den Mails die ich vom spammer erhalte stehen die header im bodytext.
Nun meine Frage, funktioniert dieser header im bodytext? Wenn ja wäre das
wirklich furchtbar.
meikel (†)
07.12.2005, 23:08:17
habe auch damit zu kämpfen. Scheint ein wirklich sehr hartnäckiger spammer zu sein.
Das ist nur einer, der Eure schlampigen Scripte austrickst.
..., handelt es sich um Bots die mit aller Gewalt ihren spam über Kontaktformulare anderer websites zu versenden.
Noch mal:
12.11. Prüfe importierte Parameter. Traue niemandem
http://www.php-faq.de/q/q-sicherheit-parameter.html
Es gelten daher die folgenden Empfehlungen:
Jede Form von Ping-Pong, also Wert-Weitergabe durch GET-Parameter, HIDDEN-Variablen und dergleichen ist zu vermeiden. Auch durch Codierung der Werte ist hier nichts zu erreichen.
Stattdessen sind Sessionvariablen zu verwenden. Nur die Session-ID wird von einer Seite an eine andere Seite weitergereicht.
Keinesfalls darf ein Programm Werte aus einer GET, POST oder COOKIE-Quelle direkt verwenden. Jeder externe Wert ist einer Plausibilitätsprüfung zu unterziehen, bevor er verwendet wird (Genau das wird in Wie unterscheide ich böse Variablen von guten? näher beschrieben).
Validierung von Eingabewerten muss serverseitig durch PHP geschehen. JavaScript-Validatoren sind nicht vertrauenswürdig: Der Browser des Anwenders führt diese Validatoren möglicherweise nicht aus, auch dann, wenn er sich durch die User-Agent-Zeile als JavaScript-fähiger Browser identifiziert. Ebenso muss angenommen werden, dass die Referer-Header des Browsers möglicherweise gefälscht sind. Man kann nicht annehmen, dass ein Zugriff tatsächlich von einer bestimmten vorhergehenden Seite hierher vermittelt wurde.
Zusammenfassend: Traue niemandem. Validiere allen Input oder stirb.
In den Mails die ich vom spammer erhalte
Dann weißte ja, wie Du ihn prinzipiell erkennst.
- verwende generell strip_tags() (es gibt noch andere Gemeinheiten).
- teste, ob in der Betreffzeile ein Zeilenumbruch versteckt ist.
- setze einen Default Absender und verwende die Absenderadresse nicht im header.
- teste aber, ob der Absender ggf. eine Adreßliste ist.
Wenn ein Fehler auftritt, dann ärgere ihn ein wenig:
sleep(25);
header('Location: http://localhost/');
exit;
Kontrolliere immer mal die Logfiles nach den verwendeten IPs. Diese kannst Du, falls mehrfach, mal über Deinen Provider in den SPAM Datenbanken eintragen lassen.
stehen die header im bodytext.
Falsch! Nach der 1. Leerzeile rangiert alles weitere unter Body - egal wie der Schrott aussieht.
schlodd
08.12.2005, 22:22:07
@ meikel, gut dann ist nichts passiert. Dann bekomme nur ich den Drecksspam.
Sonst würde ich nachher selbst als spammer dastehen, was sicherlich schlimme
Folgen nach sich ziehen würde.
bei mir wird jede ankommende Variable überprüft bevor sie an das mailscript
weitergereicht werden, welches sich außerhalb des root-Verzeichnisses be-
findet. strip_tags() habe ich schon eingebaut gehabt, jetzt habe ich zusätzlich
folgendes schnipsel hinzugefügtforeach($_POST as $k=>$v){
if(eregi("cc:",$v)){
die();
}
if(eregi("bcc:",$v)){
die();
}
if(eregi("MIME-Version:",$v)){
die();
}
if(eregi("Content-Type:",$v)){
die();
}
} und Du meinst statt das script gleich sterben zu lassen sollte ich es so tun?
foreach($_POST as $k=>$v){
if(eregi("cc:",$v)){
sleep(25);
header('Location: http://localhost/');
exit;
}
if(eregi("bcc:",$v)){
sleep(25);
header('Location: http://localhost/');
exit;
}
if(eregi("MIME-Version:",$v)){
sleep(25);
header('Location: http://localhost/');
exit;
}
if(eregi("Content-Type:",$v)){
sleep(25);
header('Location: http://localhost/');
exit;
}
} Hatte 2 Wochen Ruhe gahabt nach dem ich das Verzeichnis geändert hatte,
doppelte IPs aussortiert und absenderadressen gefiltert. Gestern war dann
wieder so´n Müll im Postfach. Na ich bin mal gespannt was jetzt noch kommt.
Hat vielleicht noch jemand hilfreiche Tipps?
Danke meikel für Deine schnelle Antwort! :)
meikel (†)
09.12.2005, 00:57:34
und Du meinst statt das script gleich sterben zu lassen
Na klar. Gleich beim ersten Fehler.
sollte ich es so tun?
Teste das einfach mal - hast ja genug Anschauungsmaterial. Mit eregi() kenne ich mich kaum aus. Ansonsten ist das die passende Antwort:
25 sec. Pause und danach ein redirect auf localhost.
Danke meikel für Deine schnelle Antwort! :)
Wenns hilft...
vBulletin® v3.8.3, Copyright ©2000-2024, Jelsoft Enterprises Ltd.