Ankündigung

Einklappen
Keine Ankündigung bisher.

Userlogin

Einklappen

Neue Werbung 2019

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

  • Userlogin

    Hallo Leute,

    ich bin gerade am Userlogin schreiben und ich habe das ganze via Cookies realisiert sprich der Benutzer loggt sich ein und ein cookie wird gesetzt mit usernamen und ob er angemeldet ist.

    Weiters will ich nun auch einen Gastlogin hinzufügen,
    sprich auf der Startseite steht "Hallo Hans" bei Gastlogin soll nun "Hallo Gast" stehen dies habe ich so realisiert:

    PHP-Code:
    if(!isset($_COOKIE['angemeldet'])) {
        
    $name 'Guest';
        }else{
        
    $name $_COOKIE['username'];
        } 
    Nun hab ich ein Problem und zwar steht jetzt immer Guest dort ich weis aber nicht weshalb.

    Meine Hauptfrage macht dieser Aufbau eines Logins einen Sinn oder sollte ich ihn anders realisieren? hier die login.php auf der das ganze ausgeführt wird:

    PHP-Code:
    require 'db_connect.php';
        
    $bname "";
        
    $pw"";
        
    print_r($_POST);
        if (
    $_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['log'])) {
            
    session_start();

            
    $username $_POST['username'];
            
    $passwort $_POST['passwort'];

            
    $hostname $_SERVER['HTTP_HOST'];
            
    $path dirname($_SERVER['PHP_SELF']);
            
    $query 'SELECT * FROM user WHERE username="'.$username.'"';
            
    // Eine SQL-Abfrage ausführen
            
    $result mysql_query($query);
            
    //echo "fehler:" .mysql_error();
            
    if(mysql_num_rows($result) == 1){
                
    $row mysql_fetch_assoc($result);
                
    $bname $row['username'];
                
    $pw $row['password'];
            }
            
    //Groß&-Kleinschreibung beachten!
            
    if(md5($passwort) == $pw && $username == $bname){
            
    // Benutzername und Passwort werden überprüft
        
            //Cookies werden gesetzt
           
    setcookie('angemeldet'true);
           
    setcookie('username'$username);

           
    // Weiterleitung zur geschützten Startseite
           
    if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
            if (
    php_sapi_name() == 'cgi') {
             
    header('Status: 303 See Other');
            }else {
             
    header('HTTP/1.1 303 See Other');
            }
            }

           
    header('Location: http://'.$hostname.($path == '/' '' $path).'/index.php');
           exit;
          }
          } 
    und die 2. hat jemand eine Idee warum jetzt immer Guest dortsteht?
    Achja beim Start der Seite wird von Anfang an Guest angezeigt und erst nach der Anmeldung wird/sollte der Name des User angezeigt werden.

    lg Blackscr33n

  • #2
    Cookies abgeschaltet?
    Nutze Sessions, da gibts den Fallback über URL...
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Für ein Login ist es keine Empfehlung die Informationen selber als Cookies zu speichern.
      Nimm besser Sessions.
      Im Link steht alles weitere.

      Kommentar


      • #4
        Ergänzend zu meinen Vorrednern:

        - mysql_* ist veraltet. Nutze PDO oder mysqli
        - SQL Injection Problem (z.B. hier: $query = 'SELECT * FROM user WHERE username="'.$username.'"'; )


        mfg wolf29
        while (!asleep()) sheep++;

        Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

        Kommentar


        • #5
          okey danke Leute für die Hilfe!

          Kommentar


          • #6
            Anmerkung - dein Login ist unsicher!

            - kein Schutz gegen Injection http://php-de.github.io/jumpto/sql-injection/

            - veraltete mysql_ Erweiterung http://php.net/manual/en/migration55.deprecated.php

            -> Nutze prepared statements in mysqli_ oder PDO, dann sind die obigen beiden Punkte "gefixt"

            - md5() ist von gestern, siehe hier: http://php.net/manual/de/faq.passwor...words.fasthash

            - PHP_SELF (wenn auch etwas anderer Kontext) http://blog.oncode.info/2008/05/07/p...scripting-xss/

            dann noch:

            - SELECT * http://php-de.github.io/jumpto/code-smells/#select-

            LG
            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


            • #7
              Laravel baut mit Eloquent per Standardverhalten genau solche Queries. Kommt auf den konkreten Fall an, ob es wirklich schlecht für die Performance ist. Aber klar, man sollte sich natürlich schon bewusst sein, was man da macht und ob die Wildcard wirklich sinnvoll ist. Habe nur gerade Zweifel, dass der TE das einschätzen kann.

              Also zur Erläuterung:
              Da * pauschal alle Attribute abfragt und die Daten dieser Attribute übertragen müssen, nun ja: Man stelle sich eine Tabelle mit 100 Feldern (z. B. für ein User-Profil mit jede Menge Attributen wie Name, Adresse, Lieblings-dies & Lieblings-das etc.) vor und man möchte nun eigentlich nur eine Liste aller User mit deren Lieblingsfilmen anzeigen. Dann würde man mit 'SELECT * FROM profile' immer ca. 100 mal so viele Daten abfragen wie mit 'SELECT fav_film FROM profile' - und das für jeden User. Also ein extremer Overhead den man möglicherweise vermeiden möchte, vor allem wenn MySQL auf einem externen Server läuft und die Daten wirklich erst mal herangeschafft werden müssen. Und je nach Hosting-Bezahlmodel ist auch nicht ausgeschlossen, dass man für MySQL-Traffic zahlen darf (meine mich zu erinnern bei AWS sei das allerdings kostenlos - vielleicht ist das auch gängig, ist nicht meine Welt).

              Kommentar


              • #8
                okey danke Leute habt mir sehr geholfen!

                Nun habe ich allerdings ein Problem und zwar:

                steht vor dem Login "Hallo Guest" Guest ist eine variable der ich den wert Guest zuweise wenn man eben nicht angemeldet ist, also beim Start.
                So nun habe ich das Problem, dass wenn ich mich anmelde noch immer Guest dortsteht obwohl eigentlich der Name dortstehen sollte hier der Code der das alles regelt:

                PHP-Code:
                if(!isset($_SESSION['angemeldet'])) {
                    
                $name "Guest";
                    }else{
                    
                $name $_SESSION['username'];
                    
                    } 
                sollte doch eigentlich simple sein und funktionieren oder?

                lg Blackscr33n

                Kommentar


                • #9
                  Das sieht richtig aus, dann prüfe was in den Variablen enthalten ist. Vermutlich nicht das was du vermutest, weil bei der Befüllung etwas falsch ist dh der Fehler an anderer Stelle schon passiert ist, es erst aber an dieser Stelle hochkommt.

                  Und als Hinweis/Tipp rück generell etwas sauberer ein, tuts dir weit leichter beim Lesen.

                  PHP-Code:
                  if (!isset($_SESSION['angemeldet'])) {
                      
                  $name "Guest";
                  } else {
                      
                  $name $_SESSION['username'];

                  Und der Vollständigkeit halber noch bei solchen Konstrukten, das kannst du (viel Geschmacksache) auch so formulieren:

                  PHP-Code:
                  $name "Guest";
                  if (isset(
                  $_SESSION['angemeldet'])) {
                      
                  $name $_SESSION['username']; 

                  oder so.. (ternärer Operator) http://php-de.github.io/jumpto/if/#t...rnrer-operator
                  PHP-Code:
                  $name = (isset($_SESSION['angemeldet'])) ? $_SESSION['username'] : "Guest"
                  Wie gesagt, nur zur Info, ev. findest du es ja leichter lesbar, weil es kompakter ist und/oder der else-Zweig oben wegfällt.

                  LG
                  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


                  • #10
                    okey danke werde da mal debuggen

                    Kommentar


                    • #11
                      okey hab den Fehler gefunden und zwar wird in der login.php
                      wo die Passwörter geprüft werden & verglichen immer ein anderer Hash für die
                      Benutzereingabe also fürs Post ausgegeben.

                      login.php:
                      PHP-Code:
                      if(password_verify(password_hash($passwort,PASSWORD_DEFAULT),$pw) && $username == $bname){ 
                      verwende ich es eventuell falsch?

                      lg Blackscr33n

                      Kommentar


                      • #12
                        immer ein anderer Hash für die
                        Benutzereingabe also fürs Post ausgegeben
                        Das gehört so, weil erhöht die Sicherheit ungemein

                        Zitat von Doku
                        salt - to manually provide a salt to use when hashing the password. Note that this will override and prevent a salt from being automatically generated.

                        If omitted, a random salt will be generated by password_hash() for each password hashed. This is the intended mode of operation.
                        Schau dir das Beispiel in der Doku dazu nochmals an:

                        http://php.net/manual/en/function.password-verify.php
                        http://php.net/manual/en/function.password-hash.php
                        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


                        • #13
                          okey es ist alles behoben und funktioniert soweit bis auf das:

                          PHP-Code:
                          if (isset($_GET['angemeldet'])) {
                                  
                          $name $_SESSION['username']; 
                                  echo(
                          $_SESSION['username']);
                              }else{
                                  
                          $name "Guest";
                              } 
                          es steht jetzt auf einmal in $_SESSION['username'] "Guest" drinnen und genau hier liegt der Fehler bin bis jetzt noch nicht dahinter gekommen warum. Kann es sein das PHP wenn ich die login.php aufrufe der Inhalt von index.php nicht aktualisiert wird?

                          lg Blackscr33n

                          Kommentar


                          • #14
                            Schau an der Stelle wo du $_SESSION['username'] befüllst. irgendwie muss das "Guest" da ja reinkommen.
                            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