Ankündigung

Einklappen
Keine Ankündigung bisher.

Ist es möglich daß ein Login ( MySQL + PHP ) nicht auf jedem System funktioniert ?!?

Einklappen

Neue Werbung 2019

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

  • Ist es möglich daß ein Login ( MySQL + PHP ) nicht auf jedem System funktioniert ?!?

    Hi!
    Ich habe ein Login PHP Skript daß anscheinend bei unterschiedlichen Usern NICHT funktioniert. Hier das Skript:
    PHP-Code:
    include_once './config/database.php';
    require 
    "../vendor/autoload.php";
    use \
    Firebase\JWT\JWT;
    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    header("Access-Control-Allow-Methods: POST");  
    header("Access-Control-Max-Age: 3600");  
    header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

    $conn null;

    $email '';
    $password '';

    $databaseService = new DatabaseService();
    $conn $databaseService->getConnection();

    // POST Variablen vom Eingabeformular ->
    $data json_decode(file_get_contents("php://input"));

    $email $data->email;
    $password $data->password;

    $query "SELECT id, name, pass FROM " $table " WHERE email = :email";  // $table kommt aus database.php

    $stmt $conn->prepare$query );
    $stmt->bindParam(':email'$email);
    $stmt->execute();
    $num $stmt->rowCount();

    if(
    $num 0)
    { ... }

    else {  
    // DB Verbindung schließen ->
    $conn null;
    http_response_code(401);
    echo 
    json_encode(array("message" => "Unbekannter User."
    ));

    Im IF Block werden diverse Abfragen durchgeführt und dementsprechende HTTP Response-Codes / Jsons zurückgegeben ( Login erfolgreich, Falsches Passwort etc ) auf diese ich dann auf der Webseite darauf reagiere ( Angular SPA )

    Jetzt ist es aber so, daß hier User sagten daß sie eine Meldung "Unbekannter User" erhalten haben, obwohl sie - laut eigener Aussage - die korrekten Daten eingegeben haben.
    Und diese Meldung kommt definitv aus dem else Block.

    Vorrausgesetzt die DB Verbindung wurde erfolgreich aufgebaut:
    1. Gibt es irgendeinen Grund, der dazu führen könnte daß es trotz korrekter Eingabe von Username & Passwort hier der else Block ausgeführt wird ?
    2. Ist es überhaupt möglich, daß sowohl der IF Block und anschließend auch der Else Block ausgeführt wird ?

    Wie könnte ich hier zudem Prüfen ob die Verbindung zur DB steht bzw. die Fehlermeldung aus der database.php checken ?

    PHP-Code:
    $table 'XXXXX';
    class 
    DatabaseService{
    private 
    $db_host "XXXX";
    private 
    $db_name "XXXXX";
    private 
    $db_user "XXXX";
    private 
    $db_password "XXXXX";
    private 
    $connection;

    public function 
    getConnection(){

    $this->connection null;

    try{
    $this->connection = new PDO("mysql:host=" $this->db_host ";dbname=" $this->db_name$this->db_user$this->db_password);
     }

    catch(
    PDOException $exception){
    echo 
    "Verbindung fehlgeschlagen: " $exception->getMessage();
    }

    return 
    $this->connection;
     }



    Bin für jeden Hinweis dankbar

  • #2
    Also zu 2: definitiv Nein!

    Zu 1 kann man nicht viel sagen. Der Code ist nicht mal vollständig, $num ist unbekannt...
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Den Code vom Else Block hab ich vollständig hier. Welchen Code würdest Du noch brauchen - die Database.php ? Den hab ich soeben oben zugefügt

      Den IF Block Code hab ich weg gelassen. Da hier niemals "Unbekannter User" zurückgegeben wird.
      Wie meinst Du das mit $num ist unbekannt ? Reicht hier
      PHP-Code:
      $num $stmt->rowCount(); 
      nicht aus ?

      Was mir noch einfällt ist:
      Starte ich hier unter Umständen die Query bevor die DB Verbindung steht ?
      PHP-Code:
      $stmt $conn->prepare$query );
      $stmt->bindParam(':email'$email);
      $stmt->execute(); 

      Kommentar


      • #4
        Da stand zuerst ein Zweizeiler, einige Zeilen sind offensichtlich in den Kommentar gerutscht.

        Zu dem angeblichen Problem kann man von hier nichts weiter sagen: Wenn der Code in den else-Zweig springt, dann wird "$num" wohl nicht größer als 0 gewesen sein.

        Wir kennen nicht den Tabellenaufbau oder -inhalte, noch wissen wir was die Benutzer tatsächlich eingegeben haben. Log doch mal die Eingaben der Benutzer mit.... jeder kann behaupten, alles richtig eingegeben zu haben, aber der Computer lügt eigentlich nie.

        Fehlerbehandlung mit einbauen, z.B. nach dem Query bei der Datenbank fragen, ob Fehler aufgetreten sind, und wenn ja, wie die Meldung dazu lautet.

        Frage zu dem Code:
        PHP-Code:
        $data json_decode(file_get_contents("php://input"));

        $email $data->email;
        $password $data->password
        Warum wird dort ein JSON String gepostet? Standard ist das nicht, also hast du ja wohl offenbar auch noch irgendwelche Spezialiäten am Frontend, die aber auch niemand ausser dir kennt.

        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Zitat von lstegelitz Beitrag anzeigen

          Warum wird dort ein JSON String gepostet? Standard ist das nicht, also hast du ja wohl offenbar auch noch irgendwelche Spezialiäten am Frontend, die aber auch niemand ausser dir kennt.
          Das Ganze kommt aus ner Angular Anwendung daher die JSON Geschichten.

          Ja, daß die Aussage: "Ich habe es korrekt eingegeben" mit Vorsicht zu genießen ist weiß ich - doch ein Fall müsste mittlerweile zig mal falsch eingeben - zudem ich mich mit seinen Zugangsdaten problemlos einloggen kann. Da werd ich dann doch ein wenig stutzig ob es nicht ein "technisches" Problem ist.

          Habe oben noch kurz ergänzt ob es nicht denkbar ist, dass ich hier die Query starte bevor die DB Verbindug überhaupt steht ?

          Kommentar


          • #6
            class DatabaseService{

            Warum eine Klasse als Wrapper? PDO ist doch schon eine Klasse. Siehe auch https://phpdelusions.net/pdo#dsn
            Wie man Fehlermeldungen in PDO ausgibt steht in der Wissenssammlung oder unter options ATTR_ERRMODE.

            PHP-Code:
            $query "SELECT id, name, pass FROM " $table " WHERE email = :email"
            Den Tabellennamen würde ich fest reinschreiben und nicht dynamisch, normalerweise ändert der sich ja nicht mehr im Laufe der Anwendung.

            echo "Verbindung fehlgeschlagen: " . $exception->getMessage();

            und danach kommen header, das geht ja schon mal gar nicht. Vor header dürfen keine Ausgaben gemacht werden.

            Ich würde das noch mal überdenken.

            Kommentar


            • #7
              Wenn du das Problem hast, dass für Dich nicht nachvollziehbar jemand sich nicht einloggen kann würd ich einen Log erstellen und dort reinschreiben wenn der 401 zurückgegeben wird und mit welchem Benutzer dies passiert.
              Dann kannst du das vielleicht besser nachvollziehen.

              Kommentar


              • #8
                Zitat von protestix Beitrag anzeigen
                class DatabaseService{
                Warum eine Klasse als Wrapper?
                ...
                und danach kommen header, das geht ja schon mal gar nicht. Vor header dürfen keine Ausgaben gemacht werden.
                Ich würde das noch mal überdenken.

                Danke für die Links - das mit der Tabelle fest reinschreiben bekomm ich hin! Werd ich auch machen.
                Meinst Du damit ich soll die Header Einträge VOR die include_once setzen?

                Zum Rest:
                Ich habe mit PHP eigentlich ganz selten etwas gemacht und der Database Code ist aus nem Beispiel das ich fand - darum kann ich dir das mit dem Wrapper nicht erklären, ausser das es evtl bequemer aufgerufen werden kann ?
                PHP-Code:
                $databaseService = new DatabaseService();
                $conn $databaseService->getConnection(); 
                Aber wie gesagt - echt keine Ahnung war 1:1 aus ner Vorlage übernommen.

                Der Login ist das Ergebnis diverser zusammengetragener Beispiele + meinem überschaubaren PHP "Wissen" -> deshalb fällt mir als PHP-Null das Überdenken jedenfalls schwerer als Du glaubst

                Kommentar


                • #9
                  Zitat von jonas3344 Beitrag anzeigen
                  Wenn du das Problem hast, dass für Dich nicht nachvollziehbar jemand sich nicht einloggen kann würd ich einen Log erstellen und dort reinschreiben wenn der 401 zurückgegeben wird und mit welchem Benutzer dies passiert.
                  Dann kannst du das vielleicht besser nachvollziehen.
                  Würde ich so machen - passt das ?
                  PHP-Code:


                    
                  else {
                       
                  // Ausgabe ->
                       
                  $time time();
                       
                  file_put_contents("__login_" $time "_Error.txt",  "User = " $email ", Passwort= " $password "" );

                       
                  // DB Verbindung schließen ->
                       
                  $conn null;
                       
                  http_response_code(401);
                       echo 
                  json_encode(array("message" => "Unbekannter User."
                     
                  ));
                     } 

                  Kommentar


                  • #10
                    Passwort würd ich jetzt nicht unbedingt, sicher nicht im Klartext. So wie ich das verstehe schlägt schon die Überprüfung auf den Benutzernamen fehl. Da brauchst du das Passwort gar nicht.

                    Ansonnsten kannst du das so machen. Oder du machst ein File, wo du die einträge anhängst. Oder eine Tabelle in der Datenbank. Aber das ist Dir überlassen.

                    Aber so siehst du zumindest wie häufigt dass das passiert und ob die Kollegen tatsächlich die korrekte E-Mail angegeben haben.

                    Kommentar


                    • #11
                      Stimmt. Passwort ist überflüssig.

                      Aber eine Frage noch:
                      Ist es hier möglich, dass ich hier die Query starte bevor die DB Verbindug überhaupt steht ? Vielleicht in Verbindung oder genau wegen dem oben erwähnten Wrapper um die PDO Klasse
                      PHP-Code:
                      $stmt $conn->prepare$query );
                      $stmt->bindParam(':email'$email);
                      $stmt->execute(); 
                      Eine fehlgeschlagene oder noch nicht fertig aufgebaute Verbindung zur DB wäre für mich der einzige logische Grund, dass User unbekannt trotz korrekter Eingabe

                      Kommentar


                      • #12
                        Unwahrscheinlich. Aber wenn du das Gefühl hast, dass es sein kann fang den Fehler ab und log ihn mit oder gibt dem User einen anderen Status zurück.

                        Dass die Fehlerbehandlung im DB-Wrapper eher unglücklich ist hat protestix ja schon in #6 bemerkt.

                        Kommentar


                        • #13
                          Zitat von jonas3344 Beitrag anzeigen
                          Dass die Fehlerbehandlung im DB-Wrapper eher unglücklich ist hat protestix ja schon in #6 bemerkt.
                          Ja, das möchte ich jetzt auch ändern - hab da wie immer offene Frage. Wenn ich die database.php so verwende wie hier beschrieben
                          PHP-Code:
                          $host 'XXX';
                          $db   'XXX';
                          $user 'XXX';
                          $pass 'XXX';
                          $charset 'utf8mb4';
                           
                          $dsn "mysql:host=$host;dbname=$db;charset=$charset";
                          $options = [    
                          PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,    
                          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,    
                          PDO::ATTR_EMULATE_PREPARES   => false, ];
                          try {      
                          $pdo = new PDO($dsn$user$pass$options); }
                          catch (\
                          PDOException $e) {  

                          throw new \
                          PDOException($e->getMessage(), (int)$e->getCode());  

                          // funktioniert sowas ? ->  
                          http_response_code(503);
                          echo 
                          json_encode(array("message" => "Verbindungsfehler"));
                          file_put_contents("__connection_Error.txt",  "Fehler = " $e->getMessage() ", ErrCode: " (int)$e->getCode() "" );

                            } 
                          Kann ich dann in der login.php so ne Verbidung aufbauen und schließen ?

                          PHP-Code:
                          $stmt $pdo->query('SELECT whatever FROM whatever');
                          ...
                          $pdo null
                          Sorry - muss leider so fragen, kann an diesem Rechner nicht ausprobieren

                          P.S.
                          Die Log Datei beim Loginversuch, welche ich ausgeben lasse zeigt übrigens daß KEINE Emailadresse vorhanden ist -> daher Unbekannter User und keine Ahnung warum

                          Kommentar


                          • #14
                            Zitat von suppenhuhn Beitrag anzeigen
                            Sorry - muss leider so fragen, kann an diesem Rechner nicht ausprobieren
                            Wie programmierst du dann, wenn du deinen eigenen Code nicht mal lokal testen kannst?

                            Bevor wir uns hier weiter verzetteln, zeige doch mal die gesamte Login Datei, also Formular und Javascript.

                            5xx Response Code kommen vom Server(Apache, nginx, IIS, etc ) und nicht von einem Script. Wenn die Datenbankverbindung fehlschlägt teile genau das dem Anwender mit und sende eine E-Mail an den Admin(hier wohl an dich) damit das repariert werden kann.

                            PHP-Code:
                            use \Firebase\JWT\JWT
                            Verwendest du die cloud davon oder warum verwendest du das?

                            Kommentar


                            • #15
                              Die Log Datei beim Loginversuch, welche ich ausgeben lasse zeigt übrigens daß KEINE Emailadresse vorhanden ist -> daher Unbekannter User und keine Ahnung warum
                              Dann erweitere das Logging... ich schrieb ja schon das dieser Code etwas seltsam anmutet:
                              PHP-Code:
                              $data json_decode(file_get_contents("php://input")); 
                              Daher: Logge, was
                              PHP-Code:
                              file_get_contents("php://input"
                              tatsächlich liefert. Denn wenn es nicht ist, was du denkst, dann ist das Ergebnis von json_decode "false". In der Folge können daraus natürlich auch keine Daten extrahiert werden...
                              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                              Kommentar

                              Lädt...
                              X