Zenturio: wo ist der fehler

$benutzer = $_POST[benutzer];  
$passwort = $_POST[passwort];  
  
$abfrage = "SELECT Benutzer, Passwort FROM login WHERE Benutzer LIKE '$benutzer'";  
$ergebnis = mysql_query($abfrage);  
$row = mysql_fetch_object($ergebnis);  
  
if($row->passwort == $passwort || $row->benutzer == $benutzer)  
    {  
    echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>";  
    }  
else  
    {  
    echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";  
    }  
 }

Moin...

alles bei euch hoffe ich mal ? :D

Bei mir zeigt er nur "Login erfolgreich" an, auch wenn das Passwort nicht stimmt bzw. Username!

Wer erkennt den Fehler, bin nicht der Profi in sowas...

Danke im Vorraus!

(PS: Keine verbesserungsvorschläge, ich behalte dieses sowieso )``

  1. Du prüfst ob Benutzername ODER Passwort übereinstimmen. Was du wahrscheinlich möchtest wäre UND.

    1. Du prüfst ob Benutzername ODER Passwort übereinstimmen. Was du wahrscheinlich möchtest wäre UND.

      so ungefähr? :

      if($row->passwort == $passwort AND $row->benutzer == $benutzer)

      zeigt trotzdem immernoch nur login erfolgreich an^^

  2. Hi,

    $benutzer = $_POST[benutzer];

    Fehler 1: Du benutzt undefinierte Konstanten
    Fehler 2: Du verschleierst die Herkunft der Variablen.

    $abfrage = "SELECT Benutzer, Passwort FROM login WHERE Benutzer LIKE '$benutzer'";

    Fehler 3: Du benutzt LIKE statt =
    Fehler 4: Du behandelst die Benutzer-Eingabe nicht kontextgerecht.

    $ergebnis = mysql_query($abfrage);

    Fehler 5: keine Fehlerbehandlung

    $row = mysql_fetch_object($ergebnis);

    if($row->passwort == $passwort || $row->benutzer == $benutzer)

    Fehler 6: || statt && (wobei die Benutzer-Abfrage schon durch das WHERE erledigt wäre ...
    Fehler 7: Du speicherst offensichtlich Klartextpaßwörter in der Datenbank.

    Wer erkennt den Fehler,

    7 hab ich gefunden, will aber nicht aussschließen, daß es noch mehr gibt.

    (PS: Keine verbesserungsvorschläge, ich behalte dieses sowieso )

    Wieso fragst Du dann?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. 7 hab ich gefunden, will aber nicht aussschließen, daß es noch mehr gibt.

      (PS: Keine verbesserungsvorschläge, ich behalte dieses sowieso )

      Wieso fragst Du dann?

      Ich liefere trotzdem einen weiteren Fehler - und zwar einen Designfehler

      1. Warum prüft nicht die Datenbank direkt beim SELECT auf username und passwort?

      Wozu macht das PHP?

      SELECT COUNT(username)  WHERE username = 'user' AND password = 'pass';

      Wenn 1 Datensatz zurückkommt, passt die Sache. Wenn 0 Datensätze geliefert werden, ist das Login ungültig, der Benutzer existiert nicht oder das Passwort ist falsch[1] - sollten 2 oder mehr Datensätze geliefert werden, hast du einen Fehler im System.

      [1] diese Information hat den, der den Loginversuch tätigt aber nicht zu interessieren). Lustige informationen wie "Benutzername gibts nicht" oder "Benutzername richtig aber Passwort falsch" helfen bei Brute-Force-Attacken ungemein.

      1. moin,

        sollten 2 oder mehr Datensätze geliefert werden, hast du einen Fehler im System.

        den man mit einem UNIQUE und NOT NULL constraint ganz unterbinden kann, dann kann es nur 1 oder 0 sein.

        Ilja

        1. Hallo Ilja,

          sollten 2 oder mehr Datensätze geliefert werden, hast du einen Fehler im System.

          den man mit einem UNIQUE und NOT NULL constraint ganz unterbinden kann, dann kann es nur 1 oder 0 sein.

          och, die Eingabe eines Benutzernamens wie

          Ilja' OR 1 --

          würde beim vorliegenden Code ebenfalls dazu führen, dass mehr als ein Datensatz geliefert wird, sofern die login-Tabelle mehr als einen Eintrag aufweist :-)

          Wie war's noch mit dem kleinen Bobby Tables ;-)

          Freundliche Grüße

          Vinzenz

          1. och, die Eingabe eines Benutzernamens wie

            Ilja' OR 1 --

            würde beim vorliegenden Code ebenfalls dazu führen, dass mehr als ein Datensatz geliefert wird, sofern die login-Tabelle mehr als einen Eintrag aufweist :-)

            Beim Vorliegenden Code des OP - nicht bei meiner SQL-Abfrage :p da gibts keine Variablen ;)

  3. Hallo,

    (PS: Keine verbesserungsvorschläge, ich behalte dieses sowieso )``

    willst Du jetzt was wissen oder nicht?

    [code lang=sql]$benutzer = $_POST[benutzer];
    $passwort = $_POST[passwort];

    a) überflüssiges Umkopieren
    b) fehlerhafte Syntax beim Zugriff auf Array-Elemente

    $abfrage = "SELECT Benutzer, Passwort FROM login WHERE Benutzer LIKE '$benutzer'";

    c) anfällig für SQL-Injection, weil kontextgerechte Behandlung missachtet wird.

    $ergebnis = mysql_query($abfrage);

    d) fehlende Fehlerbehandlung. mysql_query() kann fehlschlagen.
    e) mysql_*-Funktionen sind veraltet und sollten in neuen Projekten nicht
       mehr verwendet werden.

    $row = mysql_fetch_object($ergebnis);

    f) Gibt es überhaupt einen Datensatz?

    if($row->passwort == $passwort || $row->benutzer == $benutzer)

    g) Passworte speichrt man nicht im Klartext. Speichere gesalzene Hashes und
       nutze dies bereits in der WHERE-Klausel Deiner Abfrage.

    h) Benutze exaktere Vergleichsoperatoren.

    {
        echo "Login erfolgreich. <br> <a href="geheim.php">Geschützer Bereich</a>";

    i) Wer die URI kennt, kommt an das, was geschützt werden soll.
       Der Schutz ist also nichtexistent (Security by Obscurity doesn't work).

    Freundliche Grüße

    Vinzenz