wo ist der fehler
Zenturio
- datenbank
0 Encoder0 Zenturio
0 MudGuard
0 suit0 Ilja0 Vinzenz Mai0 suit
1 Vinzenz Mai
$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 )``
Du prüfst ob Benutzername ODER Passwort übereinstimmen. Was du wahrscheinlich möchtest wäre UND.
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^^
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
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
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.
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
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
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 ;)
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