Trying to get property of non-object
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
allgemeine aussagen
begreifen
code
eingegebene passwort
frage
kombination
korrigieren
lese
log
login
machen
not
registrieren
sache
speichern
typ
unterscheiden
verlesen
zeitpunkt
ziehen
-
Hallo,
ich hab mal kurz eine Frage zu diesem Code:
$Result = $Database->Query("SELECT password FROM users WHERE name ='$User'"); if($Result !== false and ($Result->num_rows === 1)) { // User found $Row = $Result->fetch_assoc(); $DB_PW = $Row['password']; $PW = hash("sha512",$PW); if($PW === $DB_PW) { // User gave the correct password, log him in $_SESSION['user'] = $User; } else { // Wrong password $D['Data'][] = "Das von Ihnen eingegebene Passwort war falsch!"; } } else { // User not found throw new Exception("User not found!"); }
Eigentlich ja ganz einfach und nicht allzu aufwendig dieses Loginscript. Allerdings: Wenn die Query gelingt und er einen derartigen User findet, sendet er (da mysqli) ein Object vom Typ mysql_result zurück. Will heißen $Result ist dann vom Typ object. Andernfalls ist es einfach false, da die Query ja fehlgeschlagen ist. Nun möchte ich prüfen, ob was gefunden wurde, dazu darf $Result nicht false sein und es muss ja genau einen User gegeben haben der so heißt. Also darf $Result->num_rows auch nur 1 betragen. Problem: Wenn genau einer gefunden wurde, klappt es. Wenn niemand gefunden wurde (nicht existenter Username wurde abgefragt) kommt ein Notice, Trying to get property of non-object, da zu diesem Zeitpunkt ja $Return kein Object ist. Wie kann ich das nun geschickt lösen? Einfach ein @ dranklatschen zur Fehlerunterdrückung gefällt mir nicht. Und ein verschalten in 2 if's gefällt mir auch nicht (also erst gucken ,obs != false ist und dann obs num_rows === 1 hat). Wie kann ich das nun geschickt lösen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
1. du speicherst diene passwörter cleartype in die db?
2. warum machst du den Passwort-check nciht auch gleich in die query?
damit verkürzt du dein login-Script auf
$Result = $Database->Query("SELECT `password` FROM `users` WHERE `name` ='".$User."' and `password`='".hash("sha512",$PW)."""); if($Result) { $_SESSION['user'] = $User; } else { throw new Exception("Invalid Auth-Data!"); }
wenn der mensch nciht rein kommt, wird er wohl begreifen, dass er entweder sich neu registrieren muss, oder die kombination Username/Passwort nicht stimmt... somit macht man manche sachen viel angreifbarer, wenn man das so aufschlüsselt. außerdem erzeugst du unnötige rechenlast.
ansonsten ginge das NUR über die 2 geschachtelten ifs, weil du hier ja auch etappenweise auswertest... eleganter geht es i dem fall also nicht außer 2 geschachtelte ifs... -
1. Wieso cleartype? Ich speicher sie als hash in der DB, lese den Hash aus und vergleiche den dann mit dem Hash des eingegebenen PWs.
2. Hm, ja da könnte ich es auch hinpacken.
"somit macht man manche sachen viel angreifbarer, wenn man das so aufschlüsselt. außerdem erzeugst du unnötige rechenlast."
Den Satz von dir verstehe ich ehrlich gesagt nicht. Meinst du damit, dass wenn ich nach "Falsches PW", "Falscher Nickname", etc. aufschlüssel der User dann Rückschlüsse ziehen kann und es so theoretisch angreifbarer wird oder was genau meinst du damit? -
Meinst du damit, dass wenn ich nach "Falsches PW", "Falscher Nickname", etc. aufschlüssel der User dann Rückschlüsse ziehen kann und es so theoretisch angreifbarer wird oder was genau meinst du damit?
ja, wird zwar erst bei sachen relevant, wo angezeigter name und login-name sich voneinander unterscheiden(weil zum beispiel user-mail als login genommen wird) und man sich dann etappenweise vor-raten kann, wer was hat und ob richtig oder nich. deswegen werden bei den meistne login-geschichten allgemeine aussagen getroffen a la "Diese Kombination aus User und Passwort gibt es nciht" oder "Username/Passwort nciht korrekt".
bei 1. hab ich mich einfach verlesen und das nachher vergessne zu korrigieren ( den $PW = hash("sha512",$PW); hatte ich überlesen)
Beitrag zuletzt geändert: 25.2.2013 14:43:52 von sebulon -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage