Mail Versand so sicher?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mail Versand so sicher?

    Hallo,
    habe mir ein kleines Fahrtenbuch gebastelt, bei dem man sich zuvor registrieren muss, um sich eintragen zu können, dazu wird eine Mail an den Admin(mich ) mit generiertem Link geschickt. Nun ist die Frage nach der Sicherheit dieses Mailers..
    Es geht um folgendes Formular:
    PHP-Code:
    echo "        <form action=\"registrieren.php?action=registrieren\" method=\"post\">\n"
    echo 
    "            <input type=\"text\" name=\"Name\" maxlength=\"20\"/>Mannschaftsname/Name<br>\n"
    echo 
    "            <input type=\"radio\" name=\"Typ\" value=\"einzel\">Einzel\n";
    echo 
    "            <input type=\"radio\" name=\"Typ\" value=\"mannschaft\">Mannschaft<br>\n";
    echo 
    "            <input type=\"text\" name=\"E-Mail\">E-Mail Adresse<br>\n";
    echo 
    "            <input type=\"password\" name=\"Password\" maxlength=\"10\"/>Passwort(max.10 Stellen)<br>\n"
    echo 
    "            <input type=\"password\" name=\"Passwordctrl\" maxlength=\"10\" />Passwort wiederholen<br>\n"
    echo 
    "            <input type=\"submit\" value=\"Registrieren\"/><br>\n"
    echo 
    "        </form>\n"
    darauf hin wird die E-Mail Adress mit
    PHP-Code:
    function is_email_valid($email) {
     return 
    preg_match("/^[a-zA-Z0-9_\.-]{2,}@[a-z0-9-]{3,}\.[a-z]{2,4}|museum$/i"$email);
        } 
    auf Gültigkeit geprüft, wenn das so alles passt wird
    PHP-Code:
    maile($_POST['Name'],$_POST['Typ'],$_POST['E-Mail'],MD5($_POST['Password'])); 
    aufgerufen, die folgendes beinhaltet
    PHP-Code:
    function maile($name,$typ,$email,$pw){
    $empfaenger "test@test.de";
    $betreff $name." möchte sich registrieren";
    $text "$name möchte sich für das Fahrtenbuch registrieren. <br>
                <b>Name:</b> 
    $name<br>
                <b>Typ:</b> 
    $typ<br> 
                <b>E-Mail:</b> 
    $email<br>
                <b>Passwort:</b> 
    $pw<br>
                <a href=\"generiertet Link\">Link</a>;
    $extra    = "From$email ($name)\n";
    $extra   .= "Content-Typetext/html\nContent-Transfer-Encoding8bit\n";
          mail(
    $empfaenger$betreff$text$extra); 
    irgendwie wird bei extra das \n nicht dargestellt, naja darum gehts ja auch nicht, ist das soweit sicher, oder könnte man das in irgendeiner weise immer noch missbrauchen?

    mfg Krel
    Zuletzt geändert von krel; 14.11.2006, 20:59.

  • #2
    Re: Mail Versand so sicher?

    Ist womöglich nicht sicher!

    Rückwärts aufgedröselt:
    mail($empfaenger, $betreff, ...);
    $betreff = $name." möchte sich registrieren";
    function maile($name, ...)
    maile($_POST['Name'], ...);

    Gib mal als Mannschaftsnamen "\r\nBcc: foo@example\r\nX-baz: " ein - natürlich mit einer (deiner) echten Mailadresse und schau was passiert.

    Kommentar


    • #3
      naja das passt da schon nicht rein, weil das Feld auf 20 Zeichen begrenzt ist aber ich glaub ich weiß was du meinst. Wäre das Problem ausgemerzt, wenn ich vorher prüfe ob nl2br($name)==$name ist? Oder muss ich noch mehr pruefen?

      mfg

      Kommentar


      • #4
        Und wenn der Vergleich false liefert, was dann? Willst du die Mail dann nicht verschicken? Vielleicht hat jemand seinen Namen irgendwoher ins Feld kopiert und da war zufällig ein \n drin.

        Da $_POST['name'] Bestandteil des Subject werden soll und dieses per RFC keinen Zeilenumbruch enthalten kann, kannst du einfach mit str_replace() alle \n entfernen.

        Oh Moment, jetzt sehe ich erst, dass du $name auch im From-Header verbaust. Und $email auch! Das geht natürlich auch nicht ungeprüft.

        Btw: Wozu schickst du dir selbst den MD5-Hash des Passworts? Damit kannst du doch überhaupt nichts anfangen oder?

        Kommentar


        • #5
          Original geschrieben von krel
          naja das passt da schon nicht rein, weil das Feld auf 20 Zeichen begrenzt ist
          Das interessiert niemanden, der dein Script zum Spammen benutzen will.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            wenn es false liefert, kann ich ihn darauf ja auch hinweisen und ihn zurückleiten, so wie ich es bei anderen Fehlern auch mache. Naja aber du meinst, ich soll jetzt aus $email und $name die \n entfernen. Ich weiß nämlich noch nicht so direkt worauf ich wirklich achten muss bei sowas, hab zwar auch schon nach gegoogelt, und nichts anständiges gefunden.. naja oder das falsche gesucht..

            Zum Passwort ja das ist so´ne Sache, wenn die Registrierung des Useres geglückt ist, wird noch nichts in die Datenbank geschrieben sondern es wird ein Link generiert :
            PHP-Code:
            <a href=\"test.de/php/fahrtenbuch/registrieren.php?
            action=reg&name=
            $name&typ=$typ&email=$email&pw=$pw\"> 
            auf den kann ich einfach klicken, das kann ich dann nochmal überprüfen und mittels eingabe meines PWs kann ich die Sachen dann in die Datenbank schreiben. Ist wahrscheinlich auch nicht die beste Lösung, aber mir ist sonsts nichts eingefallen, wie ich die Sachen noch weiter gespeichert halten soll, ohne sie in ne Datei zu speichern..

            mfg

            Kommentar


            • #7
              Das ist keine Antwort auf meine Frage: Wozu schickst du dir den Hash?

              http://google.com/&q=php+mail+injection

              Übrigens könntest du die Daten auch gleich in die DB schreiben und erst durch Klick auf den Link wird ein Flag gesetzt, ohne das die Daten nicht "öffentlich" sind.

              Kommentar


              • #8
                naja ich will ja nicht das PW sehen, was die sich ausgesucht haben, wird doch eh so in die DB geschrieben.Oder hab ich deine Frage noch immer falsch verstanden?
                mit den google ergebnissen werd ich mich morgen weiter beschäftigen, für heute ist erstmal schluss. Ich geh ins Bett..

                mfg

                Kommentar


                • #9
                  naja ich will ja nicht das PW sehen, was die sich ausgesucht haben, wird doch eh so in die DB geschrieben.Oder hab ich deine Frage noch immer falsch verstanden?
                  Vermutlich schon. Denn was bringt es wenn du dem User einen md5 Hash seines Passwortes zuschickst ? Wenn er versucht diesen Wert als PW beim Login anzugeben, dann wird er eh nicht reinkommen. Wenn du dem User schon das PW zuschickst (sozusagen als Bestätigung der Registrierung) dann würde es für den User mehr Sinn machen, wenn er das PW im Klartext bekommt.
                  Nur beim Eintrag in die DB speicherst du das PW besser nicht als Klartext sondern als md5 Hash.

                  Gruss

                  tobi
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Original geschrieben von jahlives
                    Denn was bringt es wenn du dem User einen md5 Hash seines Passwortes zuschickst ?
                    Macht er nicht. Er schickt es sich selbst. Insofern korrekt, dass er sich das PW nicht im Klartext zeigen läßt. Aber gleichzeitig auch völlig überflüssig, denn dem Hash kann niemand eine sinnvolle Information abgewinnen.

                    Ist aber auch egal. Hat er halt ein paar Byte mehr in seiner Inbox. Zur eigentlichen Frage nach der Sicherheit des Scripts: Wenn du morgen gegoogelt, gelesen und gefixt hast, kannst du es gern nochmal posten. Obiger Schnipsel ist nach den Hinweisen soweit okay.
                    Zuletzt geändert von onemorenerd; 15.11.2006, 01:09.

                    Kommentar


                    • #11
                      nabend

                      so hab jetzt n bisschen was gelesen und naja nicht wirklich alles verstanden, liegt wahrscheinlich einfach daran, dass ich heut nicht ganz auf der Höhe bin...
                      reicht folgende Funktion aus, oder sollte man einfach radikal alle "\n" und "\r" entfernen?
                      PHP-Code:
                      function valid_input($name,$email){
                              return(
                      strpos($name,"\r\n")>|| strpos($name,"\n")>||strpos($email,"\r\n")>|| strpos($email,"\n")>0);
                          } 
                      Also ich rufe die Funktion auf und wenn ich true zurückbekomme, brech ich einfach das Script ab und gib ne Fehlermeldung aus.
                      Achja was mich noch n bisschen verwundert: wenn ich das mal ausgebe, was in $_POST['Name'] stand, wenn ich nen \n eingebaut hat, dass er mir nen \\n ausgibt, liegt das an dem escapen von PHP?

                      mfg Krel

                      Kommentar


                      • #12
                        Original geschrieben von krel
                        Achja was mich noch n bisschen verwundert: wenn ich das mal ausgebe, was in $_POST['Name'] stand, wenn ich nen \n eingebaut hat,
                        Wenn du in einem Formularfeld die zwei Zeichen \n eingibst, dann bleiben das die zwei Zeichen \ und n, das ist deshalb noch kein Zeilenumbruch.
                        dass er mir nen \\n ausgibt, liegt das an dem escapen von PHP?
                        Ja, genauer magic_quotes_gpc.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Meine Frage ist aber, ist das jetzt sicher, oder muss ich noch mehr machen?

                          Kommentar


                          • #14
                            PHP-Code:
                            function valid_input($name,$email){
                                if(
                            strpos($name,"\r\n") !== false || strpos($email,"\r\n") !== false){
                                    return 
                            false;
                                }else{
                                    return 
                            true;
                               }

                            Bei strpos() ist es besser explizit auf den Boolean Type zu prüfen. Denn wenn die Zeichenkette mit einem \r\n beginnt, dann würde strpos() 0 zurückgeben, was aber nicht heisst, dass nix gefunden wurde, sondern dass der Treffer an Position 0 steht. Kommt der Suchstring nicht vor dann gibt die Fkt ein false zurück. Und Rückgaben von Boolean Typen solltest du immer mit === oder !== prüfen, sonst könnte eine 0 als Boolean false gewertet werden.
                            Ich würde nichts desto trotz eine Fkt bauen die einfach alle Zeilenumbrüche killt z.B.
                            PHP-Code:
                            function killNewLines($string){
                                return 
                            str_replace(array("\r\n","\n"),'',$string);

                            Gruss

                            tobi
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar

                            Lädt...
                            X