Door
rof rof
op 03-05-2017 16:39
gewijzigd op 04-05-2017 13:15
3.761 views
Ik heb geprobeerd om een login script te maken met php. Nou is het zo dat als ik via het inlog formulier wel terecht kom op de login.php pagina. Na wat troubleshooten kwam ik op het probleem dat hij wel de POST oppakt, maar er verder niks mee doet. Ik maak hierbij gebruik van prepared statements. Hier komt hij niet voorbij. Met een boolean heb ik neer gezet of hij goed is en een SESSION moet aanmaken voor de gebruiker of dat hij fout is en door word verwezen naar het inlog form.
Nu is mijn vraag: Hoe krijg ik het toch voor elkaar dat hij door de prepare heen komt en dat ik gewoon inlog als het goed is en anders het word afgebroken?
<?php
$stmt = $mysqli->prepare("SELECT * FROM testlogin WHERE username = '".$username."' AND password = '".$password."'");
//var_dump($stmt);
//print_r ($stmt);
$stmt->bind_param('ss', $username, $password);
$results = $stmt->execute();
//var_dump($stmt);
$count = mysqli_num_rows($result);
if($count == 1){
$_SESSION['logged_in'] = true;
$_SESSION['user'] = $username;
//header('Refresh: 1; url=beveiligd.php');
echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
}else{
// header('Refresh: 1; url=login_form.php');
echo 'Deze combinatie van gebruikersnaam en wachtwoord is niet juist!';
}
?>
hierboven is de code waarnaar ik refereer. Ik maak inderdaad gebruik van de MySQLI variant.
het afbreken bedoel ik mee, dat hij de combinatie als foutief ziet en de gebruiker door stuurt naar de inlog pagina.
De bovenstaande manier is niet de correcte manier om prepared statements te gebruiken. Je plakt $username en $password rechtstreeks in een querystring. Dit is zeer gevaarlijk want in deze opzet is er nog steeds SQL-injectie mogelijk.
Het gaat waarschijnlijk mis in het bind_param() deel omdat het aantal placeholders in je querystring (0) niet overeenkomt met het aantal parameters dat je wilt binden (2).
Ik zou zeggen, verdiep je nog eens goed in hoe prepare() precies werkt.
EDIT: en wat @SanThe zegt. Staat tijdens ontwikkeling het melden + weergeven van fouten in je code wel aan? Dan had je dit soort dingen er al meteen uitgehaald waarschijnlijk.
bedankt voor het reageren, ik zal me hierin verdiepen. Ik gebruik visual studio code en ik heb geen fout meldingen aan staan. Ik heb ook geen idee hoe ik het aan zet.
Dit is alleen voor ontwikkeling. Indien jouw code naar productie gaat wanneer er nog fouten in zitten in combinatie met bovenstaande code dan kan dit potentieel informatie geven over hoe deze fouten uitgebuit kunnen worden.
ik heb gekeken naar de bind_param en bind_result in de php manual. Heb ook wat geprobeerd ervan. (ik vond vaak bind_param voor de registratie) m'n registratie pagina werkt wel volledig naar behoren in prepared statements btw. ik heb een paar aanpassingen gedaan, misschien dat ik dezelfde fout nog steeds heb. ik heb even geen idee meer. code hier onder.
<?php
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
//var_dump($_POST);
$user = mysqli_real_escape_string($mysqli, $username);
$pass = mysqli_real_escape_string($mysqli, $password);
//var_dump($pass);
$stmt = $mysqli->error_list->prepare("SELECT * FROM testlogin WHERE username = ? AND password = ? ");
//var_dump($stmt);
$stmt->bind_param('ss', $user, $pass);
$stmt->execute();
//var_dump($stmt);
$count = mysqli_num_rows($result);
if($count == 1){
$_SESSION['logged_in'] = true;
$_SESSION['user'] = $username;
//header('Refresh: 1; url=beveiligd.php');
echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
}else{
// header('Refresh: 1; url=login_form.php');
echo 'Deze combinatie van gebruikersnaam en wachtwoord is niet juist!';
}
$mysqli->close();
?>
1. Als je prepared statements gebruikt hoef je geen escaping meer te doen met mysqli_real_escape_string. Sterker nog, dit moet je heel erg niet doen omdat dit tot dubbele escaping leidt.
2. Waarom selecteer je alle velden in een query als je alleen maar het feit dat een rij terug komt gebruikt? Selecteer dan gewoon als volgt: SELECT 1 FROM ....
Waar gebruik je username en password dan? Wanneer je niets gebruikt uit je resultset kun je net zo goed een dummy set selecteren, ik gebruik daar 1 voor, maar elke andere vaste waarde zou werken.