Ankündigung

Einklappen
Keine Ankündigung bisher.

Login-Skript bzw. User-Registrierung mit Email-Verifikation?

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Login-Skript bzw. User-Registrierung mit Email-Verifikation?

    Hallo in die Runde,

    ich bin neu hier und versuche gerade PHP an Hand eines Video-Kurses (bzw. Tutorials) plus zwei PHP/MySQL-Büchern zu lernen.

    Als Projekt arbeite ich an einer durchsuchbaren Datenbank, die ist auch kein Problem, das funktioniert alles wie es soll.

    Nun will ich diese Datenbank aber um einen Mitglieder-Bereich erweitern mit dem Endergebnis, dass unregistrierte Benutzer die Datenbank nur durchsuchen können, registrierte User Datensätze hinzufügen / editieren können und Admins auch Datensätze komplett löschen können.

    Da habe ich nun gerade das Registrierungs- und das Login/Logout-Script fertig, scheint auch alles erstmal zu funktionieren.
    Jedoch stößt mir etwas sauer auf, dass sich jeder mit Username, Mailadresse und Passwort registrieren kann, will sagen: ich würde gerne eine real existierende Mailadresse zur Bedingung der Registrierung machen, also dass nach dem Abschicken der Registrierung nicht nur der User in der MySQL-Tabelle angelegt wird, sondern dass per eMail ein zufällig generierter Code / Token als Link an den User abgeschickt wird und erst nach Aufrufen des Links aus der Mail, erhält der User den Status "aktiv" (meinetwegen auch Status 1 für aktiv, Status 0 für inaktiv) und kann sich dann erst in den Mitgliederbereich einloggen.
    Parallel zu dieser eMail sollte eine Mail an Admins rausgeschickt werden, dass sich ein neuer User registriert hat.

    Gibt es dafür eine entsprechende Funktion, die ihr mir empfehlen könnt, die ich mir näher ansehen sollte? Am besten auch so, dass es eine möglichst sichere Anwendung wird, die Mails also vielleicht per SSL verschlüsselt werden? Oder reicht es dafür, dass auf der Website ein SSL-Zertifikat aktiviert ist und die Seite nur via HTTPS aufrufbar ist?

    Vielen Dank schon mal im Voraus für eure Vorschläge / Ideen dazu bzgl. einer möglichen Umsetzung dieser Funktion!

    Liebe Grüße

  • #2
    Hallo, allein schon aus DSGVO Gründen ist Douple Opt-In die richtige Wahl. SSL und HTTPS zu verwenden, ist richtig.

    Ich denke mir das so:

    Der User registriert sich:
    - seine Daten werden nach Validierung in die DB geschrieben
    - der Status (z. B. "active") wird auf 0 gesetzt
    - der Zeitpunkt der Registrierung wird per SQL in die DB geschrieben
    - der Zeitpunkt des Ablaufs der Aktivierungsfrist wird die in DB geschrieben (also das Expiry Date)
    - es wird eine UIN estellt, z. B. mit

    PHP-Code:
    $random_hash md5(uniqid(rand(), true)); 
    Das System:
    - sendet dem User eine E-Mail mit einem Aktivierungslink, in dem die UIN eingebunden ist ist
    - am besten über eine Mailerklasse wie PHPmailer und nicht über die PHP mail() Funktion

    Der User:
    - klickt auf den Aktivierungslink, die UIN wird von deiner App per GET ausgelesen, validiert und gegen die Datenbank geprüft.

    Falls alles passt, bekommt der Nutzer eine nochmalige Bestätigung, dass der Account aktiviert ist, der Status wird auf 1 gesetzt.

    Wichtig ist, dass die User, die sich nicht aktiviert haben und nach Ablauf der Aktivierungsfrist ja immer noch auf Status 0 stehen, automatisch gelöscht werden, damit du keine "Leichen" in der DB hast. Da kannst du ja eine Routine programmieren, die z. B. bei jeder neuen Registrierung getriggert wird und nachsieht, ob es was zu löschen gibt.

    Wie gesagt, das wäre meine Idee, bitte berichtigt mich.

    Kommentar


    • #3
      Zitat von Miss Santrop Beitrag anzeigen
      Wie gesagt, das wäre meine Idee, bitte berichtigt mich.
      Passt!
      Das mit der Mailerklasse ist nochmal extra hervorzuheben: https://php-de.github.io/jumpto/mail-class/
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Zitat von Miss Santrop Beitrag anzeigen
        Hallo, allein schon aus DSGVO Gründen ist Douple Opt-In die richtige Wahl. SSL und HTTPS zu verwenden, ist richtig.

        Ich denke mir das so:

        Der User registriert sich:
        - seine Daten werden nach Validierung in die DB geschrieben
        - der Status (z. B. "active") wird auf 0 gesetzt
        - der Zeitpunkt der Registrierung wird per SQL in die DB geschrieben
        - der Zeitpunkt des Ablaufs der Aktivierungsfrist wird die in DB geschrieben (also das Expiry Date)
        - es wird eine UIN estellt, z. B. mit

        PHP-Code:
        $random_hash md5(uniqid(rand(), true)); 
        Das System:
        - sendet dem User eine E-Mail mit einem Aktivierungslink, in dem die UIN eingebunden ist ist
        - am besten über eine Mailerklasse wie PHPmailer und nicht über die PHP mail() Funktion

        Der User:
        - klickt auf den Aktivierungslink, die UIN wird von deiner App per GET ausgelesen, validiert und gegen die Datenbank geprüft.

        Falls alles passt, bekommt der Nutzer eine nochmalige Bestätigung, dass der Account aktiviert ist, der Status wird auf 1 gesetzt.

        Wichtig ist, dass die User, die sich nicht aktiviert haben und nach Ablauf der Aktivierungsfrist ja immer noch auf Status 0 stehen, automatisch gelöscht werden, damit du keine "Leichen" in der DB hast. Da kannst du ja eine Routine programmieren, die z. B. bei jeder neuen Registrierung getriggert wird und nachsieht, ob es was zu löschen gibt.

        Wie gesagt, das wäre meine Idee, bitte berichtigt mich.
        Ja, genau so stelle ich mir das vor - vielen Dank für den Hinweis mit dem PHPmailer, das schaue ich mir mal näher an.
        Der $random_hash-Wert müsste dann ja quasi in den Link, der via PHPmailer verschickt wird, eingefügt werden.

        Kommentar


        • #5
          Genau, sonst wäre der erzeugte Hash ja nutzlos.

          Kommentar


          • #6
            Status 0/1 halte ich für überdenkenswert, gesperrt/pausiert etc pp.

            Kommentar


            • #7
              Zitat von tomBuilder Beitrag anzeigen
              Status 0/1 halte ich für überdenkenswert, gesperrt/pausiert etc pp.
              Eigentlich möchte ich als User-Status nur zwischen "inaktiv" und "aktiv" unterscheiden. "pausiert" könnte man zwar drüber nachdenken, aber im Sinne der DSGVO müsste man ja eh nach gewisser Zeit die Daten des Accounts eines Users komplett löschen ("Recht auf Vergessen" etc.), wenn dieser seinen Account stilllegen möchte, oder?

              Kommentar


              • #8
                Es kommt darauf an, was deine App können soll bzw. ob du verschiedenen Usern auch verschiedene Rechte (z. B. nach Score, wie bei StackOverflow) einräumen willst. Da finde ich den Gedanken von tomBuilder gut.

                Kommentar


                • #9
                  Zitat von Hendy84 Beitrag anzeigen

                  Eigentlich möchte ich als User-Status nur zwischen "inaktiv" und "aktiv" unterscheiden. "pausiert" könnte man zwar drüber nachdenken(..)
                  nikosch (seufz), also ....
                  der meister hat hier ab und an mal usern begrenztes haus oder redeverbot erteilt; das hatte ich im hinterkopf.
                  0/1 halte ich nicht nur daher einfach für eine zu große einschränkung.

                  Bei einer "app" bei der gefordert wurde, dass der user beschränkte rechte haben sollte, auch wenn er noch nicht bestätigt hatte,
                  hatte ich mal zwei user tabellen (temp_user / user), temp_user konnte man auch sein, wenn noch keine daten angegeben hatte und nur getracked wurde.
                  Ob ich das Heute noch so machen würde, bezweifle ich.


                  Kommentar


                  • #10
                    Zitat von Miss Santrop Beitrag anzeigen
                    - es wird eine UIN estellt, z. B. mit

                    PHP-Code:
                    $random_hash md5(uniqid(rand(), true)); 
                    Gerade beim Stöbern auf StackOverflow ein paar Threads entdeckt, die besagen, dass uniqid / rand nicht sicher genug für Tokens sei und man stattdessen (ab PHP 7) lieber random_bytes nutzen solle - was haltet ihr davon?
                    PHP-Code:
                     <?php
                    $bytes 
                    random_bytes(5);
                    var_dump(bin2hex($bytes));
                    ?>
                    Quelle: http://php.net/manual/de/function.random-bytes.php

                    Wäre das besser oder für meine Zwecke eher irrelevant?

                    Kommentar


                    • #11
                      puh, also es stimmt das random bytes in bestimmten Situationen besser geeignet ist, aber für dein Vorhaben reicht md5 völlig aus.

                      Kommentar


                      • #12
                        Zitat von Hendy84 Beitrag anzeigen
                        Wäre das besser oder für meine Zwecke eher irrelevant?
                        Für Deine Zwecke halte ich das für eher irrelevant.
                        4 minuten früher, ich werde alt

                        Kommentar


                        • #13
                          Am Ende wird es wohl eh egal sein, dieser oder jener Einzeiler... es muss ja eh nur eine halbwegs zufällige Zeichenkette sein.

                          Zum Userstatus, da würde ich auch mehr als 2 Zustände einplanen. Für mich wäre zumindest "Muss Registrierung noch bestätigen" einen eigenen Statuswert wert.
                          Kommt am Ende aber wirklich drauf an wie die Anforderungen aussehen.
                          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                          Kommentar


                          • #14
                            Bitte die Forrenregeln beachten!

                            Vielen Dank schon mal im Voraus für eure Vorschläge / Ideen dazu
                            Bitte beachten: Inserate, Konzepte und Meinungsumfragen

                            Und, Crosspost: https://www.php-resource.de/forum/ph...ifikation.html

                            MOD: Geschlossen
                            The string "()()" is not palindrom but the String "())(" is.

                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar

                            Lädt...
                            X