Schrift
[thread]1071[/thread]

Sicherheit der mailer.php: Warum kommen fast leere mails an?



<< >> 10 Einträge, 1 Seite
Pida
 2007-03-31 00:39
#9975 #9975
User since
2006-06-09
52 Artikel
BenutzerIn
[default_avatar]
UPDATE: Das ursprüngliche Problem ist gelöst, indem ich Aufrufe per GET ablehne. In einem neuen Post unten habe ich aber ein weiteres Problem mit SPAM beschrieben.
-----
Hallo,

ich habe eine Frage zur Sicherheit des Kontaktformulars meiner Homepage. Unten seht ihr den PHP-Teil meiner mailer.php, die bei Senden des Formulars aufgerufen wird.
Ich habe einiges aus diversen Foren und Tutorials zusammengetragen, so dass eigentlich keine mail injections möglich sein sollten.
Was mich aber irritiert: Gelegentlich kommen mails bei mir an, die außer den festen Bestandteilen von $text keinen Inhalt haben.

Ist das ein Grund zur Sorge? Ich überprüfe mit Absicht nicht die Vollständigkeit und Art der Angaben; wer statt der eMail seine Telefonnummer angeben möchte, soll das ruhig tun.

Hier nun der Code:
Code: (dl )
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
<?php

if ($_SERVER['REQUEST_METHOD'] == 'GET') die ("Bitte das Kontaktformular benutzen! Es wurden keine Daten &uuml;bermittelt.");

// Tags entfernen, @ und / umwandeln
foreach($_POST as $key=>$value) $_POST[$key]=(strip_tags($value));
foreach($_POST as $key=>$value) $_POST[$key]=(str_replace("/","SLASH",$value));
foreach($_POST as $key=>$value) $_POST[$key]=(str_replace("@","BEI",$value));


$sender = $_POST["sender"];
$sendermail = $_POST["sendermail"];
$newsletter = $_POST["newsletter"];
$betreff = "Newsletter";


// Auf Längenüberschreitungen prüfen
if (strlen($sender) > 60 || strlen($sendermail) > 60) {
die("ACHTUNG: Name und Mailadresse dürfen 60 Zeichen nicht überschreiten.");
}


// (Versteckte) Zeilenumbrüche ablehnen
$sendermail = urldecode($sendermail);
$sender = urldecode($sender);
if ((eregi("(\r|\n)", $sendermail)) || (eregi("(\r|\n)", $sender))) {
die ("ACHTUNG: Unter Name und Mailadresse dürfen keine Zeilenumbrüche eingegeben werden.");
}


$text = "$sender sendet folgende Nachricht:

" . $_POST["text"] . "
Die Adresse lautet $sendermail.

Newsletterbezug: $newsletter";


mail("abc@abc.net", $betreff, $text,
"From: www.abc.net");
?>


Gruß, Pida\n\n

<!--EDIT|Pida|1180377235-->
renee
 2007-03-31 15:19
#9976 #9976
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was, wenn kein POST-Request kommt, sondern ein GET-Request?

Ich denke, dass ein $_REQUEST besser wäre als ein $_POST.

Du überprüfst auch keine Minimallängen. Nach möglichkeit sollte der Text länger als 0 Zeichen sein (selbst zwei Zeichen dürften dem Sinn wiedersprechen).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2007-03-31 20:30
#9977 #9977
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=renee,31.03.2007, 13:19]Was, wenn kein POST-Request kommt, sondern ein GET-Request?

Ich denke, dass ein $_REQUEST besser wäre als ein $_POST.

Du überprüfst auch keine Minimallängen. Nach möglichkeit sollte der Text länger als 0 Zeichen sein (selbst zwei Zeichen dürften dem Sinn wiedersprechen).[/quote]
wenn das formular die methode POST hat, warum sollte man das
nicht im script auch so überprüfen? der, der das formular
als GET abschickt, ist ja offensichtlich jemand, der das formular
scripten will.
also, ich würde eher überprüfen, welche request-methode benutzt
wurde und bei GET gar nichts machen. das verhindert auch simple
XSS-attacken.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Pida
 2007-03-31 22:14
#9978 #9978
User since
2006-06-09
52 Artikel
BenutzerIn
[default_avatar]
Danke für eure Antworten.

In der Tat benutze ich POST genau deshalb, weil die Daten so durch mein Kontaktformular übergeben werden.
Minimallängen überprüfe ich nicht, da ich dem 'Anwender' des Formulars die größtmögliche Freiheit lassen will. Wer also nur das Textfeld ausfüllen möchte... bitteschön. Ein Abfrage, ob ALLE Felder leer sind, baue ich vllt. noch ein.

Aber haltet ihr den Code denn für sicher? Mich stört es nicht, ab und an eine 'leere' Mail zu empfangen. Ich möchte mich nur absichern, dass dies kein Nebeneffekt einer erfolgreichen mail injection ist.

Gruß, Pida
GwenDragon
 2007-03-31 23:26
#9979 #9979
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Nachdem mail wohl das ist:
Code: (dl )
bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )
und das an sendmail weiter gegeben wird, kann nichts passieren, solange to und subject von dir festgelegt werden.

Es sei denn die Funktion mail hat irgendeine Lücke betreffs Bufferoverflow bei zu langen Texten!

Was ist eigentlich, wenn irgendeine Variable von Backticks also \` eigeschlossenes enthält? Die werden doch dann ausgeführt!? Na ja, kommt wireder auf die PHP-Konfiguration an.\n\n

<!--EDIT|GwenDragon|1175369771-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

pq
 2007-04-01 13:05
#9980 #9980
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Pida,31.03.2007, 20:14]Mich stört es nicht, ab und an eine 'leere' Mail zu empfangen.[/quote]
aber wenn du prüfst, ob die methode POST war und ob alle pflichtfelder
ausgefüllt sind, kannst du dir trotzdem leere mails ersparen und die
sicherheit erhöhen, dass spammer nicht durch Wikipedia:Cross-site_request_forgery
spam unter der ip anderer verschicken.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Gast Gast
 2007-05-28 22:29
#9981 #9981
Update:

Ich erhalte in den letzten Tagen vermehrt eMails von mailer daemons, in denen dann Zeilen wie diese vorkommen:

-----
Received: from xx-a4b348279b3f
by MEINEDOMAIN.de with ASMTP id 97AFDB46
for <blubs@blubs.blobb.edu>; Mon, 28 May 2007 20:14:46 +0200
-----

Die mails gehen an die Adresse MEINVORNAME@MEINEDOMAIN.de.

Meine Frage: Ist das Zufall bzw. erklärt sich das Auftauchen von 'MEINEDOMAIN' im Text der mail durch meine Mailadresse, oder muss ich das ganze als einen Hinweis werten, dass mein PHP doch noch unsicher ist?

Danke, Pida
GwenDragon
 2007-05-29 20:56
#9982 #9982
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Wenn du jetzt GET ablehnst, wie stellst du das Eintragsformular bereit (das muss ja mit GET geholt werden). Oder ist das Formular wieder eine andere PHP-Datei, die ein Post auf die mailer.php verwendet?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Pida
 2007-05-29 22:02
#9983 #9983
User since
2006-06-09
52 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für Deine Antwort.

Tatsächlich gibt es noch eine weitere Datei.
Hier der Code des Formlars:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<!-- Kontaktformular -->
<form id="kontakt_form" action="danke.php" method="post">
<p>Name: <input type="text" size="35" name="sender" /></p>
<p id="kontakt_mail">eMail: <input type="text" size="35" name="sendermail" /></p>
<p><textarea cols="67" rows="15" name="text">
Hier ist Platz f&uuml;r eine pers&ouml;nliche Nachricht oder eine Buchungsanfrage.
</textarea></p>
<input type="radio" checked="checked" name="newsletter" value="1" /> Den Newsletter abonnieren<br />
<input type="radio" name="newsletter" value="0" /> Keinen Newsletter beziehen<br />
<input id="kontakt_submit" type="submit" value="Abschicken" />
</form>
<!-- Ende Kontaktformular -->


Gruß, Pida
GwenDragon
 2007-05-29 22:38
#9984 #9984
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Aha. Dass es eine andere Seite gibt, dachte ich mir.

Es kann schon sein, dass es auch an deinem Skript liegt.
Oder an PHP selbst.

Die mail()-Funktion von PHP besitzt ein paar Sicherheitslecks.
http://securityvulns.com/Qdocument509.html
http://securityvulns.com/Qdocument508.html

Du solltest auch \0 und \t und sonstige Leerzeichen herausfiltern. Und zwar überall.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

<< >> 10 Einträge, 1 Seite



View all threads created 2007-03-31 00:39.