Simon: email bestätigung

Hi,
hätte da noch eine andere Frage:

Ich klick z.B auf den link (http://www.beispielcom/confirm.php?email=blabla@bla.com) und in der confirm.php stell ich eine Verbindung zur Datenbank her und hol mir die email adresse mit $email = $_GET["email"]; aus dem Link. Ich will jezt den 0er aus dem Feld "confirm_email" aus der datenbank in einen 1er umwandeln. Ist das so richtig?:

1)Verbindung zur Datenbank:

$connectID = mysql_connect($hostUrl, $userName, $password)
  or die ("Tut mir leid, kann keine Verbindung zur Datenbank aufbauen");
mysql_select_db("beispiel", $connectID)
  or die ("Auswahl der Datenbank nich Möglich");
}

2)User aus Dtenbank auswählen (anhand der Email aus dem Link):

3)Den 0er in einen 1er umwandeln:

$connectID = mysql_query("UPDATE beispiel SET email_confirm='1' WHERE email_confirm='0'")
or die(mysql_error());

  1. verbindung schließen.

Vieleicht könnt ihr mir bei schritt 2 helfen?

MfG
Simon

  1. Vieleicht könnt ihr mir bei schritt 2 helfen?

    hole benutzer aus datenbank bei dem die mailadresse mit dem parameter mail übereinstimmt (vorsicht, entsprechend mit mysql_real_escape_string arbeiten) ggf generierst du aber auch besser einen hash oder eine id des benutzers die es zu aktivieren gilt um nicht die mail im klartext zu übergeben

  2. Zu 3)
    Die Anweisung bedeutet "Setze überall den email_confirm-Wert auf 1 wo er auf 0 steht"

    Na, fällt was auf? Der Haken ist das Wort "überall". Damit würde ein User mit seine Bestätigung ALLE User freischalten. Kann gewollt sein, ist aber eher unwahrscheinlich.

    Richtig wäre:
    mysql_query("UPDATE beispiel SET email_confirm='1' WHERE email=" . $_GET["email"];

    Das geht natürlich nur, wenn die DB-Spalte auch "email" heißt. Ansonsten anpassen.

    Ich möchte aber auch darauf hinweisen, dass dieser Code UNSICHER!!!! ist . Warum? Weil jemand über den URL-Parameter beliebigen SQL-Code einschleusen kann. Dafür gibt es mysql_real_escape(). Bitte dort weiterlesen!

    Hi,
    hätte da noch eine andere Frage:

    Ich klick z.B auf den link (http://www.beispielcom/confirm.php?email=blabla@bla.com) und in der confirm.php stell ich eine Verbindung zur Datenbank her und hol mir die email adresse mit $email = $_GET["email"]; aus dem Link. Ich will jezt den 0er aus dem Feld "confirm_email" aus der datenbank in einen 1er umwandeln. Ist das so richtig?:

    1)Verbindung zur Datenbank:

    $connectID = mysql_connect($hostUrl, $userName, $password)
      or die ("Tut mir leid, kann keine Verbindung zur Datenbank aufbauen");
    mysql_select_db("beispiel", $connectID)
      or die ("Auswahl der Datenbank nich Möglich");
    }

    2)User aus Dtenbank auswählen (anhand der Email aus dem Link):

    3)Den 0er in einen 1er umwandeln:

    $connectID = mysql_query("UPDATE beispiel SET email_confirm='1' WHERE email_confirm='0'")
    or die(mysql_error());

    1. verbindung schließen.

    Vieleicht könnt ihr mir bei schritt 2 helfen?

    MfG
    Simon

    1. Richtig wäre:
      mysql_query("UPDATE beispiel SET email_confirm='1' WHERE email=" . $_GET["email"];

      Passt das dann so?:

      <?php
      $connectID = mysql_connect($hostUrl, $userName, $password)
        or die ("Tut mir leid, kann keine Verbindung zur Datenbank aufbauen");
      mysql_select_db("beispiel", $connectID)
        or die ("Auswahl der Datenbank nich Möglich");

      mysql_query("UPDATE members SET email_confirmed='1' WHERE email=" . $_GET["email"]
        or die ("Auswahl der Datenbank nich Möglich");
      mysql_close($connectID);

      ?>

      Abgesehn von den mysql_real_escape(). Das werde ich später versuchen.

      MfG
      Simon

      1. Passt das dann so?:

        wie gesagt: ich würde bei jedem aktivierungsvorgang einen hash vergeben

        anstatt email_confirmed 0 oder 1 ein email_confirmed 5eb63bbbe01eeed093cb22bb8f5acdc3 oder 1 - alle mit 1 sind bestätigt, alle mit einem hash nicht - oder lege ein extra feld dafür an "hash_confirm" oder so

        ansonsten kann man problemlos auch ungültige mailadressen bestätigen da man nur das registierierformular ausfüllen muss und dann die bestätigung selbst "generieren" kann, da man ja die gefälschte mailadresse hat

        schicke lieber an den benutzer eine bestätigungsmail mit dem confirm-link

        Abgesehn von den mysql_real_escape(). Das werde ich später versuchen.

        nein, gleich - das musst du IMMER sofort einbauen und nicht "erst später" weil das auch in einer testumgebung potentiell gefährlich ist - ein spambot bzw einen brute-force-bot interessiert das ggf nicht, der probiert einfach "index.php?id=12345+injections" aus und dann vielleicht mal "test.php?email=random@example.com+injection" - irgendwann erwischts dich

        die chance dass es dich sofort erwischt ist klein, aber mit jeder minute die  deine seite erreichbar ist, erhält der server wahrscheinlich hunderte solcher anfragen

        1. Hi,

          Abgesehn von den mysql_real_escape(). Das werde ich später versuchen.
          nein, gleich - das musst du IMMER sofort einbauen und nicht "erst später" weil das auch in einer testumgebung potentiell gefährlich ist

          Und auch sonst "nachher" nur allzu leicht "vergessen" wird.

          MfG ChrisB

          --
          „This is the author's opinion, not necessarily that of Starbucks.“
        2. hash
          Hi,
          könntest du mir vieleicht das mit dem hash besse erklären?

          Hier ist noch mal mein Script:

          <?php
          $email = $_GET["email"];
          $hostUrl = 'localhost';
          $userName = 'web290';
          $password = 'JdRGIqTy';
          $connectID = mysql_connect($hostUrl, $userName, $password)
            or die ("Tut mir leid, kann keine Verbindung zur Datenbank aufbauen");
          mysql_select_db("usr_web290_4", $connectID)
            or die ("Auswahl der Datenbank nich Möglich");

          mysql_query("UPDATE members SET email_confirmed='1' WHERE email = §email", $connectID)
            or die ("Auswahl der Datenbank nich Mfbfbfböglich");
          mysql_close($connectID);

          ?>

          MfG
          Simon

          1. hash
            Hi,
            könntest du mir vieleicht das mit dem hash besse erklären?

            statt der email übergibst du eine prüfsumme der email und die user-id

            zb aktivieremich.php?user=123&hash=8ca8891ccd348612a54b62366b5ca7fc

            in der datenbank steht dann folgendes

            user | email              | confirmed | hash
            -----+--------------------+-----------+---------------------------------
            123  | random@example.com | 0         | 8ca8891ccd348612a54b62366b5ca7fc

            du setzt dann den confirmed, dessen hash UND benutzerid mit den gegebenen parametern übereinstimmt

            die lösung mit der mailadresse ist wie gesagt fehlerhaft

            ich melde mich zb für einen newsletter an, bekomm eine bestätigunsmail und bestätige die mail dann mit der mail-adresse?

            dh ich registriere mich mit billgates@example.com und kann diese bestätigen, ohne dass mir die mailadresse geschweige denn die domain gehört - dämliche lösung

            darum: beim registrieren wird ein hash aus irgendwelchen werten erzeugt - zb  aktuelle zeit plus aktuelle haarfarbe von nina hagen plus e-mail-adresse des benutzers - er darf nur nicht reproduzierbar sein, auch wenn der algorithmus bekannt ist - dafür ist eine kombination mit time() oder microtime() oder einer zufallszahl interessant, da es sogut wie unmöglich ist, dass ein potentieller spammer (oder was auch immer), der eine falsche adresse registrieren will exakt den zeitpunkt der hashgenerierung am server in sekunden oder millisekunden

            wenn das geschafft ist, erwarte ich von dir, dass du deine benutzereingaben nicht ungeprüft an ein sql-statement übergibst - mysql_query schützt dich zwar prinzipiell vor einfachen injections die aus einer mehrere abfragen machen, aber nicht gegen komplexere dinge - darum: escapen und wie schon erwähnt nicht nachher sondern JETZT

            1. Hi,
              hab jezt versucht das mit dem Hash zu machen. Bin grad am verzweifeln.
              Könnte sich vieleicht jemand einen Teil des Scripts anschauen und mir weiter helfen. Das Poblem ist nur dass weder das mail  ankommt noch der Eintrag gemacht wird.
              Wenn ich das gesamte Script online stellen soll, falls hier was wichtiges fehlt, bitte sagen.

              Bitte nicht glauben dass ich jezt erwarte dass ihr das für mich macht, ich will nur ein paar tipps, weil ich es schließlich lernen will.

              MfG
              Simon

              Script:

              $email_confirmed ="0";
              $timestamp_hash = time();
              $datum_hash = date("dmY",$timestamp);
              $hash ="$timestamp_hash $datum_hash$email";

              if  (!$returnedID &&!$error_msg && $_POST['submitted']) {

              writeMemberSignup ($first_name, $last_name, $email, $password1, $email_confirmed, $hash);

              $_SESSION['name']='loggedIn';

              header ('Location: a_sign_up.php');

              exit();
               }

              $my_email = "www.heimgeistig.at";

              $email_subject="Bestätige deine Registrierung auf heimgeistig.at!";
               $email_body = "Danke für die Registrierung auf heimgeistig.at. Bitte klick auf den Link um deine Registrierung zu bestätigen:\n\n LINK Wenn der Link nicht funtkioniert kopier ihn einfach in deinen Webbroser und drück Enter!";
                      mail ($email, $email_subject, $email_body, "From: ".$my_email);

              1. Mahlzeit Simon,

                $my_email = "www.heimgeistig.at";

                ...

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                1. Mahlzeit Simon,

                  $my_email = "www.heimgeistig.at";

                  ...

                  MfG,
                  EKKi

                  Nein, das wahr nur ein Test damit ich weiß ob ed funktioniert mit dem Absender. Hab nur vergessen es wieder zu ändern.

      2. Mahlzeit Simon,

        <?php
        $connectID = mysql_connect($hostUrl, $userName, $password)
          or die ("Tut mir leid, kann keine Verbindung zur Datenbank aufbauen");

        Zitat 1282

        mysql_select_db("beispiel", $connectID)
          or die ("Auswahl der Datenbank nich Möglich");

        Zitat 1282

        mysql_query("UPDATE members SET email_confirmed='1' WHERE email=" . $_GET["email"]

        1. fehlt da die schließende Klammer des Funktionsaufrufs und das abschließende Semikolon,
        2. fehlt die Kennzeichnung des Wertes von $_GET['email'] als String innerhalb der SQL-Anweisung und
        3. solltest Du Werte IMMER kontextgerecht behandeln ... nicht erst "später", "irgendwann" oder "gar nicht".

        or die ("Auswahl der Datenbank nich Möglich");

        Ich denke, dass - abgesehen von dem oben bereits zweimal erwähnten Zitat - dieser "Hinweis" eher falsch ist.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    2. echo $begrüßung;

      Richtig wäre:
      mysql_query("UPDATE beispiel SET email_confirm='1' WHERE email=" . $_GET["email"];

      Das ist genauso falsch wie bei Kalle_B.

      Ich möchte aber auch darauf hinweisen, dass dieser Code UNSICHER!!!! ist . Warum? Weil jemand über den URL-Parameter beliebigen SQL-Code einschleusen kann. Dafür gibt es mysql_real_escape(). Bitte dort weiterlesen!

      Du weißt es doch (fast - "_string" fehlt in mysql_real_escape_string). Warum machst du es nicht gleich richtig?

      echo "$verabschiedung $name";

  3. Hi,

    2)User aus Dtenbank auswählen (anhand der Email aus dem Link):

    3)Den 0er in einen 1er umwandeln:

    $connectID = mysql_query("UPDATE beispiel SET email_confirm='1' WHERE email_confirm='0'")
    or die(mysql_error());

    Damit verandelst du sämtliche 0er in 1er.

    Du musst ergänzen
    WHERE email_confirm='0' AND email=$_GET["email"]

    Vieleicht könnt ihr mir bei schritt 2 helfen?

    Wenn du nur die "1" reinscheriben willst, ist Schritt 2 überflüssig. Den Erfolg des UPDATE kannst dü überprüfen mit

    $h02 =( mysql_affected_rows( $conn_id ) == 1 ); // Satz geaendert ...
      $h05 =( mysql_affected_rows( $conn_id ) == 0 ); // nichts zu aendern (ist schon 1) oder Satz nicht vorhanden

    LG Kalle

    1. echo $begrüßung;

      Du musst ergänzen
      WHERE email_confirm='0' AND email=$_GET["email"]

      Nein, das ist falsch! Zum einen fehlt die Kennzeichnung des Wertes von $_GET["email"] als String und zum anderen die kontextgerechte Behandlung des Wertes. Richtig wäre:

      $sql = sprintf("… WHERE email_confirm='0' AND email='%s'", mysql_real_escape_string($_GET['email']));

      echo "$verabschiedung $name";