- Johannes - : PHP Formular Sicherheit

Hallo,

habe im Netz folgendes simple Formular gefunden:

	  
							<!-- send mail configuration -->  
							<input type="hidden" value="email@yourserver.com" name="to" id="to" />  
							<input type="hidden" value="Enter the subject here" name="subject" id="subject" />  
							<input type="hidden" value="send-mail.php" name="sendMailUrl" id="sendMailUrl" />  
							<!-- ENDS send mail configuration -->  
							
<?php  
  
  
//vars  
$subject = $_POST['subject'];  
$to = explode(',', $_POST['to'] );  
  
$from = $_POST['email'];  
  
//data  
$msg = "NAME: "  .$_POST['name']    ."<br>\n";  
$msg .= "EMAIL: "  .$_POST['email']    ."<br>\n";  
$msg .= "WEBSITE: "  .$_POST['web']    ."<br>\n";  
$msg .= "COMMENTS: "  .$_POST['comments']    ."<br>\n";  
  
//Headers  
$headers  = "MIME-Version: 1.0\r\n";  
$headers .= "Content-type: text/html; charset=UTF-8\r\n";  
$headers .= "From: <".$from. ">" ;  
  
  
//send for each mail  
foreach($to as $mail){  
   mail($mail, $subject, $msg, $headers);  
}  
  
?>

Jetzt ist für mich die Frage, ist dieses Formular sicher, da die Mail Adresse in der html Datei sichtbar ist. Oder sollte man nicht irgendwie eine Variable mit überliefern, die dann in der PHP Datei geprüft wird *konfus*. Da mir aber letzteres nicht so ganz klar ist, hier meine Frage. Ein Profi wird vermutlich die Hände über den Kopf zusammenschlagen, aber mir ist nicht ganz klar, ob hier ein Sicherheitsrisiko besteht oder nicht.

  1. Natürlich ist der obere Teil der html Teil,

    der untere ist dann der PHP Teil.

    1. hi,

      Natürlich ist der obere Teil der html Teil,

      der untere ist dann der PHP Teil.

      Diese Art der Trennung ist gut. Falls Du später mal objektorientiert arbeiten solltest, betrachte eine Response-Seite als Objekt mit Attributen. Da wäre z.B. die E-Mailadresse ein Attribut und alle Attribute sind so gekapselt, dass sie nach außen hin nicht sichtbar sind.

      D.h., ist die Response-Seite ein Kontaktformular, wird beim Senden das interne Attribut Email verwendet und das muss nicht in GET oder POST erscheinen, und auch nicht im Quelltext.

      Horst Hackenheimer

  2. Mahlzeit,

    Jetzt ist für mich die Frage, ist dieses Formular sicher, da die Mail Adresse in der html Datei sichtbar ist.

    Das ist absolut sicher. Und war ist es sicher, dass sich jeder Spamversender freut, dass du ihm sowas zur Verfügung stellst.
    Dasproblem ist nicht, dass du die mail im HTML hinterlegt hast, sondern dass du sie ungeprüft an die Mailfunktion weiterreichst.

    Damit kann ich per simplen POST-Request eine beliebige mail an beliebige Empfänger versenden.

    --
    42
    1. Hallo,

      Das ist absolut sicher. Und war ist es sicher, dass sich jeder Spamversender freut, dass du ihm sowas zur Verfügung stellst.
      Dasproblem ist nicht, dass du die mail im HTML hinterlegt hast, sondern dass du sie ungeprüft an die Mailfunktion weiterreichst.
      Damit kann ich per simplen POST-Request eine beliebige mail an beliebige Empfänger versenden.

      und nicht nur das - ich kann auch noch Absender, Betreff, Nachrichtentext und bei Bedarf weitere Header frei von der Leber weg eintragen. Eine 1a-SPAM-Maschine.

      Von anderem Unsinn im Script (unnötiges Umkopieren von Variablen, Deklaration der Nachricht als HTML, obwohl nur Plaintext verschickt wird) wollen wir gar nicht reden. Aber Benutzereingaben ungeprüft weiterverarbeiten ist eine Todsünde.

      Ciao,
       Martin

      --
      Fische, die bellen, beißen nicht.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    2. Om nah hoo pez nyeetz, M.!

      wobei der HTML-Teil mit den hidden-Feldern durchaus auch ein spam-filter sein kann, nach dem Motto, wenn da was drin steht, wars ein Bot.

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Torte und Tortellini.

  3. <!-- send mail configuration -->
    <input type="hidden" value="email@yourserver.com" name="to" id="to" />

    Hach, da werd' ich richtig nostalgisch. Wie lange ist das jetzt her mit dem berühmt-berüchtigten Perl-Kontaktformular, das, hundertausendfach heruntergeladen, zum ersten Mal großflächig mit genau diesem Fehler Spammern Tür und Tor geöffnet hat? 15 Jahre, 20 Jahre? War das ab 1995 (siehe auch 2001)? Die Idioten sterben nicht aus :)

    1. <!-- send mail configuration -->
      <input type="hidden" value="email@yourserver.com" name="to" id="to" />

      Hach, da werd' ich richtig nostalgisch.

      Ja Moment, das Problem ist ja gelöst, wenn obige Zeile aus der html Datei entfernt wird und stattessen im PHP Quelltext da wo jetzt " to " steht entsprechend meine Mail Adresse eintrage...

      1. Mahlzeit,

        Ja Moment, das Problem ist ja gelöst, wenn obige Zeile aus der html Datei entfernt wird und stattessen im PHP Quelltext da wo jetzt " to " steht entsprechend meine Mail Adresse eintrage...

        Klar, doch, wenn du nen mailer willst, der nur an dich Mails verschickt.
        Wieso du dann im Code die Möglichkeit vorsiehst, an mehrere Mailadressen zu versenden, erschliesst sich mir nicht.

        Ich vermute mal, du hast absolut keine Ahnung von dem was du da machst und probierst jetzt solange rum, bis es irgendwie klappt. Und dadurch wirst du immer wieder Sicherheitslöcher einbauen, die du im schlimmsten Fall erst bemerkst, wenn du Post vom Anwalt hast.

        --
        42
        1. Ja Moment, das Problem ist ja gelöst, wenn obige Zeile aus der html Datei entfernt wird und stattessen im PHP Quelltext da wo jetzt " to " steht entsprechend meine Mail Adresse eintrage...

          Natürlich. Ich find's nur drollig, dass nach über zehn Jahren immer noch so ein Mist im Netz verbreitet wird (nicht von dir, siehe unten). Einfach nicht auszurotten ..

          (Aber du darfst dir gerne dein Stotterschreib ab- und den Bindestrich angewöhnen.)

          Klar, doch, wenn du nen mailer willst, der nur an dich Mails verschickt.
          Wieso du dann im Code die Möglichkeit vorsiehst, an mehrere Mailadressen zu versenden, erschliesst sich mir nicht.

          Na, nun mal sachte. Den Code hat er aus dem Netz gefischt und das Problem ist ihm sofort aufgefallen. Das darf gerne lobend honoriert werden, offenbar hat er ja als Anfänger zumindest mehr Gefühl für sowas als derjenige, der den Kram verbrochen hat.

          1. Mahlzeit,

            (Aber du darfst dir gerne dein Stotterschreib ab- und den Bindestrich angewöhnen.)

            Was hat das mit mir zu tun?

            Na, nun mal sachte. Den Code hat er aus dem Netz gefischt und das Problem ist ihm sofort aufgefallen. Das darf gerne lobend honoriert werden, offenbar hat er ja als Anfänger zumindest mehr Gefühl für sowas als derjenige, der den Kram verbrochen hat.

            Was ist ihm aufgefallen?
            Er fragte nach, ob das ganze unsicher ist. Somit hat er den Code überhaupt nicht verstanden und das tut er jetzt auch nicht.
            Wenn du sowas honorieren willst, kriegt jemand, der den Code versteht den Nobelpreis?

            Wenn jemand nichtmal die Grundlagen versteht, ist eine solche Nachfrage im Forum grad mal akzeptierbar aber abolut nicht honorierbar.

            --
            42
            1. Om nah hoo pez nyeetz, M.!

              Wenn jemand nichtmal die Grundlagen versteht, ist eine solche Nachfrage im Forum grad mal akzeptierbar aber abolut nicht honorierbar.

              Nein, es ist löblich.

              Matthias

              --
              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen digital und Digitalis.

            2. (Aber du darfst dir gerne dein Stotterschreib ab- und den Bindestrich angewöhnen.)

              Was hat das mit mir zu tun?

              Du solltest erstmal lernen, Zitatmarkierungen zu verstehen, bevor du dich in einem Forum über die angeblichen Verständnisprobleme anderer Leute echaufierst.

              Na, nun mal sachte. Den Code hat er aus dem Netz gefischt und das Problem ist ihm sofort aufgefallen.

              Was ist ihm aufgefallen?
              Er fragte nach, ob das ganze unsicher ist. Somit hat er den Code überhaupt nicht verstanden

              Wenn er den Code "überhaupt nicht verstanden" hat, warum hat er dann genau das Problem genannt, das den Code unsicher macht? Wie kann er dann "überhaupt" darauf kommen, dass es mit dem Code ein Problem geben könnte? Wenn er überhaupt nicht verstanden hätte, was da passiert, hätte er den Code dann nicht eher 1:1 eingesetzt, ohne nachzufragen?

              Denk da mal drüber nach. Die Antwort darfst du dem hohen Ross, auf dem du hockst, in den Allerwertesten schieben.

              Das darf gerne lobend honoriert werden, offenbar hat er ja als Anfänger zumindest mehr Gefühl für sowas als derjenige, der den Kram verbrochen hat.

              Wenn du sowas honorieren willst, kriegt jemand, der den Code versteht den Nobelpreis?

              Wenn jemand nichtmal die Grundlagen versteht, ist eine solche Nachfrage im Forum grad mal akzeptierbar

              Hui, das ist wirklich gnädig von dir. Für jemanden wie dich, der die Weisheit offenbar im stillen Kämmerlein mit Löffeln gefressen und sich erst als unfehlbarer Experte der Öffentlichkeit präsentiert hat, ist es aber auch ein Zumutung, das andere ihm noch während ihres Lernprozesses unter die Augen treten.

              1. Mahlzeit,

                Du solltest erstmal lernen, Zitatmarkierungen zu verstehen, bevor du dich in einem Forum über die angeblichen Verständnisprobleme anderer Leute echaufierst.

                Hast du noch nicht gemerkt, dass wir hier eine Baumstruktur haben?
                Also erklär du mir nicht, was ich lernen soll, wenn du die Forenstruktur nicht verstehst!

                --
                42
      2. <!-- send mail configuration -->
        <input type="hidden" value="email@yourserver.com" name="to" id="to" />

        Hach, da werd' ich richtig nostalgisch.

        Ja Moment, das Problem ist ja gelöst, wenn obige Zeile aus der html Datei entfernt wird und stattessen im PHP Quelltext da wo jetzt " to " steht entsprechend meine Mail Adresse eintrage...

        Logisch, solange die Mail Adresse in der html Datei als Variable übergeben wird, lässt sich diese natürlich ändern. Wenn die Mail Adresse in der PHP Datei steckt, so natürlich nicht mehr.

        Also muß die Mail Adresse IN die PHP Datei und nicht in die HTML Datei !! Das ist soweit korrekt.

        Recherchiere auch in einer Suchmaschine nach Kontaktformular PHP, nehme dir etwas Zeit und dann wirst du es merken. Hoffentlich hast du dieses Formular so noch nicht im Einsatz.

  4. Om nah hoo pez nyeetz, - Johannes - !

    habe im Netz folgendes simple Formular gefunden:

    Nimm dies.

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Erze und Erzeugnisse.

  5. Hallo,

    hierzu kannst Du auch ein Skript benutzen, welches Du auf folgender Seite findest: www.elite-formmailer.de .

    Habe diesen Formmailer selbst im Einsatz und bin sehr zufrieden.

    Gruß Alex

    1. Mahlzeit,

      Habe diesen Formmailer selbst im Einsatz und bin sehr zufrieden.

      Kannst ja mal die URL hier posten, ich bin mir sicher, es gibt Leute die ne Spamschleuder wollen. Du bist der Traum der Spamwelt, wenn du dieses Script einsetzt.

      --
      42
      1. Om nah hoo pez nyeetz, M.!

        Kannst ja mal die URL hier posten, ich bin mir sicher, es gibt Leute die ne Spamschleuder wollen. Du bist der Traum der Spamwelt, wenn du dieses Script einsetzt.

        Da du dir ja offensichtlich das Script angeschaut hast, wäre es schön, wenn du die Unzulänglichkeiten/Fehler konkret und sachlich benennst.

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Bus und Bussard.

        1. Mahlzeit,

          Da du dir ja offensichtlich das Script angeschaut hast, wäre es schön, wenn du die Unzulänglichkeiten/Fehler konkret und sachlich benennst.

            
          $email = $_POST["email"];  
          
          
            
          function pruefe_mail($email)  
          {  
          	return eregi("^[_a-z0-9-]([-_.]?[a-z0-9])*@[a-z0-9]([-_.]?[a-z0-9])+[.][a-z0-9]+$",$email);  
          }  
          
          
            
          @mail($email, $betreffkunde, $kopie, "From: " . $ihre_emailadresse);  
          
          

          $email ist die Adresse desjenigen, der den Formmailer ausfüllt und an dem eine Kopie der mail geschickt wird.
          Somit kann ich als "eigene" mailadresse die Zieladresse angeben und damit an jedem ungeprüft jede mail versenden. Zusätzlich bekommt derjenige, der im Mailer als Empfänger angegeben ist,  jede Spammail.
          Da die Mail nur auf Gültigkeit geprüft wird, kann dadurch jede, nach diesem Regex gültige, Mailadresse als Empfänger übergeben werden.

          --
          42