dedlfix: formmailer-problem

Beitrag lesen

echo $begrüßung;

bin PHP-Neuling erster Stunde, wenn überhaupt...

Das brauchst du nicht zu betonen, das sieht man anhand der Fragestellung auch so :-)

"Beim Versenden der E-Mail ist ein Fehler aufgetreten!"
kommt beim verschicken als Fehler! allerdings weiss ich nicht was den fehler auslöst! :(
  if(@mail($mail_to,$header))

Du bekämst einen Fehler angezeigt, wenn du ihn nicht mittels @ unterdrücktest.

Und noch ein paar allgemeine Dinge:

$from_name=$_POST['fromname'];

Solche Umkopier-Aktionen sind überflüssig. $_POST['fromname'] kann wie jede andere Variable auch direkt verwendet werden.

$from_name=str_replace(chr(34),"''",$from_name);

Das ist Blödsinn. Warum soll " gegen '' ausgetauscht werden?

$from_name=stripslashes($from_name);

Das soll offensichtlich gegen die Magic Quotes helfen, die in diesem Fall wieder einmal mehr stören als Nutzen bringen. Nicht immer sind sie aktiviert. Eine bedingungsloses Entfernen ist deshalb nicht angebracht. Verwende zum Entfernen der Magic Quotes das im Kapitel Disabling Magic Quotes angegebene Beispiel 31.2 einmalig und direkt am Scriptanfang.

<td width=100%><input type="text" name="fromname" size=25 maxlength=120 value="<?php echo $from_name; ?>"></td>

Wenn du Benutzereingaben und andere aus unsicheren Quellen stammende Daten in den HTML-Code einbetten möchtest musst du die HTML-eigenen Zeichen berücksichtigen und behandeln, sonst ist das eine XSS-Lücke. PHP kennt dafür die Funktion htmlspecialchars().
Ah, hier soll also das obige Austauschen der " gegen die '' verhindern, dass man damit das mit value=" geöffnete Attribut wieder schließen kann. htmlspecialchars() kann das viel besser und ohne die " zu verfälschen.

echo "<p><a href="".$PHP_SELF."?from_name=$from_name&from_mail=$from_mail&mail_text=";

$PHP_SELF muss auch nicht unbedingt existieren. Das Feature register_globals, das dies macht ist schon seit langer Zeit statandardmäßig nicht mehr eingeschaltet. Verwende besser den entsprechenden Wert aus dem Array $_SERVER.

Ebenfalls anfällig für das missbräuchliche Ausnutzen der register_globals=On-Einstellung sind solche Konstrukte:

if(trim($from_name)=="") $err_text.="Bitte gib Deinen Namen an.<br>";

Die Variable $err_text ist vorher nicht initialisiert worden. PHP legt sie zwar nun an, wenn sie noch nicht da war. Wenn aber jemand einen Parameter namens err_text über die URL oder die Post-Daten mitsendet, wird die Variable dank register_globals angelegt und mit von dir nicht gewünschtem Inhalt vorbelegt. Variablen sollten deshalb vor dem ersten lesenden Zugriff unbedingt (= außerhalb von if) mit definiertem Wert angelegt werden, z.B. $err_text = '';

if(($send=="1") && (isset($err_text))) {

Du kannst dann natürlich nicht mehr mit isset() auf Existenz von $err_text prüfen, denn nun ist sie ja immer da. Prüfe lieber ob sie einen Inhalt länger als 0 Zeichen hat, z.B. if (strlen($err_text))

echo "$verabschiedung $name";