Ben met een systeem bezig.
Hier de login functie:
<?php
# login
public function logIn($loginVars) {
# prepare
$_db = new PDO(config::$_dbServer, config::$_dbUser, config::$_dbPass);
$_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
# check password
$username = $loginVars['username'];
$query3 = "SELECT auth, id, password FROM users WHERE username = '" . $username . "' AND status = 1";
$result3 = $_db->query($query3);
foreach ($result3 as $row) {
if ($row['password'] == sha1($loginVars['password'])) { // user gets access
# set session vars
$_SESSION['loggedIn'] = true;
$_SESSION['sessionData']['id'] = $row['id'];
$_SESSION['sessionData']['auth'] = $row['auth'];
} else { // user input wrong data: no access
# return to login
$this->goToLogin(true);
exit;
}
}
# exit
$_db = NULL;
}
?>
Deze werkt half: voer ik een bestaande user in met verkeerd password: error.
Onbekende user: toegang.
Waar ligt dit aan? Werkt nog niet lang met PDO, heb er dus nog weinig ervaring mee.
Bij voorbaat dank!
?
Onbekende gebruiker
17-08-2010 17:18
Kijk eens hoe je variabelen aan een PDO query bind. Nu heb je sql injecties.
Dat weet ik; het script is ook nog niet af!
Die functie quote leverde bij mij ook fouten of juist helemaal niets op..
Maar karl: zie jij waar het fout gaat? Ik denk zo: onbekende user leverd een leeg resultaatset op. De voorwaarde in de if met de passworden zal dus altijd false zijn..
Alleen gok ik dat ik dan nog steeds toegang krijg. Als ik nu een niet bestaande user intyp, kom ik er ook in: dat zou ook niet kloppen volgens mijn logica.
?
Onbekende gebruiker
17-08-2010 17:25
Ik het script gewoon eerst geheel net maken. En stap voor stap door het script lopen met echo's en var_dumps om te kijken hoe het loopt.
Dat heb ik gedaan. Een echo voor $row['password'] is altijd leeg... Toch werkt het inloggen met een bestaand account en goede password WEL!
print_r($_db->query($query3)) levert een PDO statement verhaal op..
Het komt er op neer dat ik PDO vandaag voor het eerst ECHT gebruik..
Zo voor de hand zijn en dus GEEN fouten zichtbaar?
[size=xsmall]Toevoeging op 17/08/2010 21:14:19:[/size]
Ik heb het probleem nu opgelost:
helemaal onderaan, onder $_db = NULL; opnieuw controleren of $_SESSION['loggedIn'] bestaat en true is dmv functie:
$this->checkLogin();
Die hem automatisch naar de login doorstuurt als er geen sessie is.
Wat er dus verkeert gaat, is dat het script ergens in de foreach vastloopt. Dit weet ik omdat er GEEN sessies worden aangemaakt, maar je wel de pagina krigt te zien. Wel vreend dat PHP op error_reporting E_ALL geen error geeft!
Toch nog iemand die mij met deze veiligheidslek kan helpen?
[size=xsmall]Toevoeging op 17/08/2010 21:21:11:[/size]
Wat er voornamelijk fout gaat:
$blablabla = $_db->quote($blablabla);
wat hier uit komt weet ik niet, maar iig niet wat het moet zijn.
Als je een onbekende user invoert, levert je query 0 regels op. De foreach-lus wordt daardoor nooit doorlopen, en je komt op je #exit regeltje. Maar dan gebeurt er niets meer, je script gaat gewoon verder.
Als je SanThe's advies pakt, wordt het allemaal nog veel simpeler:
<?php
function checkLogin($username, $password)
{
$query = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :hash");
$query->bindParam(':username', $username);
$query->bindValue(':hash', sha1($password)); // bindParam neemt een reference, en dat kan niet bij een return-value van een functie dus pakken we bindValue.
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
if(!$row) {
// er zijn _geen_ regels met die gebruikersnaam en wachtwoord, dus inloggen mislukt
$this->goToLogin(true);
exit;
}
// hier weet je zeker dat er een gebruiker is gevonden, en kan je z'n sessie klaarstomen.
$_SESSION['user'] = $row;
}
?>