Edgar Ehritt: Bestellformular fehler

Beitrag lesen

Hallo Teufel,

Kann mir vieleicht jemand sagen, was man an dem code ändern müsste, dass es richtig geht?

da müsst so viel geändert werden, dass es mehr Sinn macht, Dir von phpkit abzuraten; aber wohl an:

<?php
error_reporting(E_ALL);
$error = false;
$errors = array();
$receiver = 'xxx@xxx.xxx';

function check_email ($string) {
// RegEx created by Myle Ott, found at regexlib.com
return preg_match('/^([a-zA-Z0-9_-])+(.([a-zA-Z0-9_-])+)*@(([(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))).(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))]))|((([a-zA-Z0-9])+(([-])+([a-zA-Z0-9])+)*.)+([a-zA-Z])+(([-])+([a-zA-Z0-9])+)*))$/i', $string);
}

Die Gestalt einer Mail-Adresse wird durch die RFC 5322; 3.4 festgelegt. Demnach besteht eine Mail-Adresse aus einem Lokalen Teil, der sich von der Domain durch ein @-Zeichen trennt.

Der Lokale Teil kann seinerseits entweder aus einer Zeichenfolge von Buchstaben, Zahlen und einigen Sonderzeichen !#$%&'*+-/=?^_{|}~, oder aus einer Zeichenfolge bestehen, die in Doppelten Anführungszeichen quotiert ist. Diese besteht auch aus Buchstaben und Zahlen, kann aber mehr Sonderzeichen enthalten. Darunter können neben den Zeichen !#$%&'()\*+,-/:;<=>?@[]^\_{|}~ auch Leer- sein. Beide Varianten des Lokalen Teils dürfen darüber hinaus auch Punkte enthalten, können jedoch weder mit einem Punkt beginnen noch enden. Insgesamt darf der Lokale Teil die Länge von 64 Zeichen nicht überschreiten. (RFC 5321; 4.5.3.1.1)

Der Reguläre Ausdruck '/([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*/i' wird dem nicht gerecht.

Den syntaktischen Aufbau einer Domain definiert RFC 1035; 2.3.1. Sie besteht aus Namensbausteinen, die alle den gleichen Regeln folgen und voneinander jeweils mit einem einfachen Punkt abgetrennt werden. Im einfachsten Fall besteht Domain aus genau einem Baustein (z. B. localhost). Jeder Namensbaustein ist zwischen 1 und 63 Zeichen lang, muss mit einem Buchstaben beginnen und darf danach Buchstaben, Zahlen und Bindestriche enthalten. Faktisch kommen derzeit aber bei einer Top Level Domain (so z. B. com, de, net) keine Zahlen oder Bindestriche vor. Die Domain kann laut RFC 5321 Abs. 4.5.3.1.2 255 Zeichen Länge nicht überschreiten. Somit kann eine Mail-Adresse maximal 319 Zeichen lang sein.

Der Reguläre Ausdruck '/((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$/i' wird dem nicht gerecht.

function check_onlynumbers ($string) {
return preg_match('/[1]{1,}$/', $string);
}

function check_onlyletters ($string) {
return preg_match('/[2]{1,}$/', $string);
}

function send_email ($subject, $body, $receiver, $html = 1) {
if ($html != 1) {
  $body = str_replace('<br />', "\n", $body);
  $body = str_replace('<br>', "\n", $body);

Die Ersetzungen sind Fehleranfällt. So ist es standardkonform <br/> oder auch <br id="bla"> zu notieren. Hier sollte also auch ein RegEx mit einer entsprechenden Funktion genutzt werden. Weiterhin sollte die Nachricht $body mit wordwrap alle 78 Zeichen durch Zeilenumbrüche geteilt werden. Das folgt aus RFC 5322; 2.1.

$body = strip_tags($body);
}

$subject = str_replace('\n', '', $subject);
$subject = str_replace('\r', '', $subject);

Diese Ersetzung ist nicht korrekt. Zum einen muss es "\n" und "\r" heißen (also Doppelte Anführungszeichen), damit PHP die Entsprechungen interpretiert. Zum anderen wäre hier eine Kodierung nach RFC 2231 ratsam. Auch wenn man nicht umkodieren will, fährt man immer noch besser mit str_replace(array("\r\n","\r","\n"),' ',$subject);, weil mit Leerzeichen ersetzt wird.

if ($html) {
  $header = 'MIME-Version: 1.0' . "\n";
  $header .= 'Content-type: text/html; charset=iso-8859-15'."\n";
  $header .= 'From: '.$receiver.' <'.$receiver.'>'."\n";
} else {
  $header = 'MIME-Version: 1.0' . "\n";

MIME-Deklaration ist im Klartextformat nicht notwendig.

...

Alles weitere lässt sich ohne die include.php nicht sagen.

Jedenfalls muss ich einmal mehr meine Entrüstung zum Ausdruck bringen, welche katastrophalen Scripte im Internet angeboten werden.

Gruß aus Berlin!
eddi


  1. 0-9,. ↩︎

  2. a-zA-ZäöüÄÖÜß ↩︎