A Secure FormMailer | "unknown software exception"
Polar F11 Batteriewechsel | Polar F11 Werkseinstellungen | Polar F11 Changing Batteries | Polar F11 Factory Defaults |

Startpage

Joomla Software

 uddeIM

   uddeIM
   Templates
   Premium Plugins
   Languages
   Screenshots
   Donations

 uddePF

   uddePF
   Plugins
   Donations

SpamPal Plugins

   RegExFilter
   Notify
   Logfile
   Quarantine

Older Versions

   Older Versions

Other Tools

   Auto Folder

Polar F11

   Batteriewechsel
   Werkseinstellungen
   Changing Batteries
   Factory Defaults

Miscellaneous

   Secure FormMailer
   "unknown software
exception"

Old Projects
Atari ST

   LED/AVALON

   CasioSF

Quality Tests

   CD/DVD

About me

   Business

Internal

   Donations
   Spenden (D)
   Impressum (D)

 

 

Sorry, at the moment there is no english translation available.

Ein sicherer FormMailer in PHP

Wird das PHP-Kommando mail() falsch verwendet, ist der FormMailer u.a. anfällig gegen "code injection" und kann z.B. von Spammern dazu benutzt werden an beliebige Empfänger SPAM zu versenden.

Die Syntax des Befehls lautet

bool mail (to, subject, message [, additional_headers [, 
                                     additional_parameters]] )

Aufgrund der Parameter könnte man auf die Idee kommen, einen PHP-Mailer wie folgt zu implementieren ($ffrom = Name des Absenders, $femail = EMail des Absenders, $fmsg = Nachricht). Der Empfänger ist fest im Skript vorgegeben, und kann somit nicht verändert werden (wie auch die Betreffzeile).

$fheaders = "From: $ffrom <$femail>"; 
mail("webmaster@domain.com", "Message from FormMailer", 
         $fmsg, $fheaders);

Auf den ersten Blick scheint das Skript "sicher" zu sein. Die Tücke liegt im Parameter "additional_headers". Hier wird eine "From:" Zeile zusammengesetzt, die es ermöglichen soll, direkt per Reply-Funktion im E-Mail Client, auf die Nachricht zu antworten. Gibt der Benutzer als Name z.B. "John Doe" ein und als E-Mail Adresse "john@doe.de", wird daraus "From: John Doe <john@doe.de>". Allerdings kann genau dieses dazu verwendet werden, um an beliebige Adressen E-Mails zu versenden.

Gibt der Spammer im Webbrowser folgendes ein

http://www.doe.de/php/formmailer.php?ffrom=John%20Doe%0ATo:%20
         das_opfer@victim.com%0A%0A&femail=john@doe.de&
         fmsg=Das%20ist%20SPAM!

wird daraus die Nachricht

From: John Doe
To: das_opfer@victim.com

<john@doe.de>
To: webmaster@domain.com
Subject: Message from FormMailer

Das ist SPAM!

Als Resultat wird die Nachricht nun nicht mehr an die fest vorgegebe Adresse "webmaster@domain.com" verschickt, sondern an "das_opfer@victim.com", da sich die Trennzeile zwischen Nachrichten-Header und -Body hinter der eingeschleusten "To:"-Zeile befindet.

Um einen Formmailer gegen Spamming zu sichern, sollte deshalb sichergestellt werden, dass

  • keine fremden Zeilen eingeschleust werden können, und
  • nur eine bestimmte Anzahl von Nachrichten pro Tag versendet werden können.
Die hier vorgeschlagene Implementierung erfüllt diese Forderungen. Hinweis: Das nachfolgende Skript ist nicht direkt lauffähig, sondern gibt Anregungen für einen eigenen Formmailer.

$isok = true;
if(!$_POST) {
  print("Fehler in Nachricht!\n"); 
  $isok = false;
}
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@([0-9a-z]
          [0-9a-z-]*[0-9a-z]\.)+[a-z]{2}[mtgvu]?$", 
          $femail, $check)) {
  print("Bitte eine gültige Email-Adresse angeben!\n"); 
  $isok = false;
}

$mailheaders = "From: FormMailer \n"; 
$mailheaders .= "X-Mailer: PHP FormMailer\n"; 

$mymsg = "Absender: \"$fname\" <$femail>\n";
$mymsg .= "\n";
$mymsg .= "$fmsg\n";

if ($isok) {
  $hitslog = "mailcnt.txt";
  if (!file_exists($hitslog))
    touch($hitslog);
  $hits = file($hitslog);
  $lastdate = $hits[1];
  $heute = getdate();
  $hits[0] = $hits[0] + 1;
  $hits[1] = $heute["yday"];
  if (intval($lastdate)!=intval($hits[1])) {
    $hits[0] = 1;
  }
  $fp = fopen($hitslog, "w");
  fwrite($fp, "$hits[0]\n");
  fwrite($fp, "$hits[1]\n");
  fclose($fp);
  if ($hits[0]<=500) {
    if (mail("john@doe.de", "FormMailer", $mymsg, 
                                        $mailheaders)) { 
      print("Nachricht wurde gesendet!\n"); 
    } else { 
      print("Fehler beim Versenden der Nachricht!\n"); 
    }
  } else {
    print("Fehler beim Versenden der Nachricht! (Quota)\n"); 
  }
}


Click to zoom pictures.

 
Copyright Stephan Slabihoud