Inlogsysteem logt niet in
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?
- Ariën -:
Titel aangepast van: Men login script werkt niet naar Inlogsysteem logt niet in. Gelieve voortaan duidelijk je probleem- of vraagstelling aan te geven.
Gewijzigd op 04/05/2017 13:15:28 door - Ariën -
En als je het over prepared statements hebt, bedoel je dan de MySQLi-variant of de PDO-variant (aangenomen dat je MySQL gebruikt)?
Het bovenstaande komt mij een beetje vreemd over, wat bedoel je met "afgebroken"? Loopt de query echt in de soep en/of krijg je een foutmelding?
De enige manier om hier duidelijkheid over te krijgen is dat je je relevante code plaatst zodat we precies kunnen zien wat er gebeurt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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!';
}
?>
$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.
Gewijzigd op 04/05/2017 13:15:51 door - Ariën -
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.
Gewijzigd op 03/05/2017 16:57:52 door Thomas van den Heuvel
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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();
?>
$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();
?>
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 04/05/2017 13:16:24 door - Ariën -
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 ....
bedoel je meer zoiets?
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.
Houd het kort, exact en simpel.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = ? AND password = ?");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();
$count = $stmt->rowCount();
$row = $stmt->fetch();
if($count == 1){
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $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!';
}
$conn = null;
?>
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = ? AND password = ?");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();
$count = $stmt->rowCount();
$row = $stmt->fetch();
if($count == 1){
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $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!';
}
$conn = null;
?>
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 04/05/2017 14:14:51 door - Ariën -
Je bent je bewust van het feit dat je je password niet veilig omzet in een hash? En dat het dus als plain-text vergeleken wordt? Niet echt gewenst.....
Toevoeging op 04/05/2017 14:38:24:
Sorry dat ik zo snel weer reageer, maar ik heb een update op de status.
Code (php)
1
2
3
4
5
2
3
4
5
$username = $_POST['username'];
$password = $_POST['password'];
$hashed = hash('sha512', $password);
$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = '".$username."' AND password = '".$hashed."'");
$password = $_POST['password'];
$hashed = hash('sha512', $password);
$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = '".$username."' AND password = '".$hashed."'");
Met deze code werkt m'n login systeem. Mijn vraag hierop volgend is dan weer: is dit wel veilig?
Gewijzigd op 05/05/2017 17:13:33 door - Ariën -
Je rijgt opnieuw rechtstreeks user input in een querystring. Dit moet je op een indirecte manier doen via placeholders en het binden van variabelen hieraan. Dat is de crux van prepared statements die queries veilig(er) maakt.
Gewijzigd op 05/05/2017 17:00:52 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
?>
$stmt = $conn->prepare("SELECT * FROM testlogin WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
?>
Gewijzigd op 06/05/2017 08:48:51 door Marlies Maalderink