Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL INJEKTION Umstellung Login

Einklappen

Neue Werbung 2019

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

  • SQL INJEKTION Umstellung Login

    Hallo, versuche gerade mein Login Code anzupassen.

    Es kommt die Meldung "Incorrect username!" der Username ist aber richtig! Darf in einem String ein @ Zeichen vorhanden sein?
    Oder wo ist das Problem? username = email

    PHP-Code:
     if (isset($_POST['btn-login'])) {

        if ( !isset(
    $_POST['email'], $_POST['password']) ) {

    } else {

        if (
    $stmt $link->prepare('SELECT user_id, password FROM tbl_users WHERE email = ?')) {
        
    $stmt->bind_param('s'$_POST['email']);
        
    $stmt->execute();
        
    $stmt->store_result();
        
    $stmt->close();
    }


       
    // $email = $link -> real_escape_string($_POST['email']);
       // $password = $link -> real_escape_string($_POST['password']);

        //$query = $link->query("SELECT user_id, phone, email, password FROM tbl_users WHERE email='$email'");
        //$row=$query->fetch_array();
        //$count = $query->num_rows;

        
    if ($stmt->num_rows 0) {
        
    $stmt->bind_result($id$password);
        
    $stmt->fetch();
        if (
    password_verify($_POST['password'], $password)) {
            
    session_regenerate_id();
            
    $_SESSION['loggedin'] = TRUE;
            
    $_SESSION['name'] = $_POST['email'];
            
    $_SESSION['id'] = $id;
            echo 
    'Welcome ' $_SESSION['name'] . '!';
        } else {
            echo 
    'Incorrect password!';
        }
    } else {
        echo 
    'Incorrect username!';
    }






    // if (password_verify($password, $row['password']) && $count==1) {
     // $_SESSION['userSession'] = $row['user_id'];       
     //  header("Location: info_point.php");

       
    $timestamp date('d-m-Y H:i:s');
       
    $query "INSERT INTO tbl_debug(email,ip,timestamp,button,webseite,pc,funktion,meldung,color)VALUES('$email','$ip','$timestamp','Login','Login','$pc','OnClick','$info  @ [Login successful]', '#adff2f')";
       
    $link->query($query);

    //} else {   

     //  $timestamp = date('j-n-Y H:i:s');
    //   $query = "INSERT INTO tbl_debug(email,ip,timestamp,button,webseite,pc,funktion,meldung,color)VALUES('$email','$ip','$timestamp','Login','Login','$pc','OnClick','$info  @ [Login unsuccessful] Fehler beim Login', '#ff0000')";
    //   $link->query($query);
    //     header("Location: error.php");
    }    
    }
    ?> 

  • #2
    Wenn 'Incorrect username!' ausgegeben wird, dann schlägt doch schon diese Abfrage fehl:

    PHP-Code:
    if (isset($_POST['btn-login'])) { 

    Kommentar


    • #3
      schauderhaft - nutze mal nen anständigen Code-Editor zum einheitlichen Einrücken deines Codes ... dann solltest auch du klar sehen, welche Abfrage letztlich zu der Ausgabe führt ...
      bzw. schau dir mal PHPStorm an ... der färbt den Code gleich noch ein, um ihn übersichtlicher zu machen - und das Einrücken erledigt er automatich gleich mit
      "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

      Kommentar


      • #4
        Hallo, ich nochmal

        ist dieser Code vor SQL Injektionen sicher?

        PHP-Code:

        <?php 

        session_start
        ();
        $pdo = new PDO('mysql:host=localhost;dbname=test''root''');

        if(isset(
        $_GET['login'])) {

            
        $email $_POST['email'];
            
        $passwort $_POST['passwort'];

            
        $statement $pdo->prepare("SELECT * FROM users WHERE email = :email");
            
        $result $statement->execute(array('email' => $email));
            
        $user $statement->fetch();

            
        //Überprüfung des Passworts

            
        if ($user !== false && password_verify($passwort$user['passwort'])) {

                
        $_SESSION['userid'] = $user['id'];

                die(
        'Login erfolgreich. Weiter zu <a href="geheim.php">internen Bereich</a>');

            } else {

                
        $errorMessage "E-Mail oder Passwort war ungültig<br>";

            }
        }
        ?>

        Kommentar


        • #5
          Ansich sind prepade Statements ein sichers Mittel vor SQL Injection.

          Du solltest aber auch die Felder vorher überprüfen. Denn das hier kann dir um die Ohren fliegen, wenn Email oder Passwort nicht gesetzt sind.

          PHP-Code:
              $email $_POST['email'];
              
          $passwort $_POST['passwort']; 
          Besser:

          PHP-Code:
              $email $_POST['email'] ?? null;
              
          $passwort $_POST['passwort'] ?? null

          Edit:
          Und hier $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email"); solltest du nicht alle Felder Abfragen, sondern nur die welche du brauchst.

          Kommentar


          • #6
            Zitat von Zeichen32 Beitrag anzeigen
            Ansich sind prepade Statements ein sichers Mittel vor SQL Injection.

            Du solltest aber auch die Felder vorher überprüfen. Denn das hier kann dir um die Ohren fliegen, wenn Email oder Passwort nicht gesetzt sind.

            PHP-Code:
            $email $_POST['email'];
            $passwort $_POST['passwort']; 
            Besser:

            PHP-Code:
            $email $_POST['email'] ?? null;
            $passwort $_POST['passwort'] ?? null

            Edit:
            Und hier $statement = $pdo->prepare("SELECT * FROM users WHERE email = :email"); solltest du nicht alle Felder Abfragen, sondern nur die welche du brauchst.
            Die Inputfelder müssen gesetzt sein! HTML
            HTML-Code:
            required
            das würde doch ausreichen oder?

            Kommentar


            • #7
              Zitat von blackfire Beitrag anzeigen
              Die Inputfelder müssen gesetzt sein! HTML
              HTML-Code:
              required
              das würde doch ausreichen oder?
              Nein. Das required lässt sich problemlos entfernen und das Formular kann ohne eine Eingabe in dem Feld abgeschickt werden. Du musst sowas *immer* prüfen, traue niemandem!

              Kommentar


              • #8
                Außerdem MUSS eine Antwort an dein Script nicht zwingend von einem Browser kommen .. es gibt da so gewisse Zeitgenossen, die nur so zum Spaß die Antwort etwa mittels Perl-Script geben ... da ist dann dein "required" völlig uninteressant ....
                "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                Kommentar

                Lädt...
                X