Password verify functie werkt niet
Als ik de functies password_hash en password_verify gebruik op één pagina (dus zonder database of iets te posten) werkt het.
Bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$pass = password_hash(trim('test'), PASSWORD_DEFAULT)."\n";
echo $pass;
$hash = '$2y$10$0roNho2E.TddAXh8kHC/ver2LdLFJkTr.NijuLSuBt7K1e74sYjha';
$password = 'test';
if (password_verify($password, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
echo $pass;
$hash = '$2y$10$0roNho2E.TddAXh8kHC/ver2LdLFJkTr.NijuLSuBt7K1e74sYjha';
$password = 'test';
if (password_verify($password, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
Bovenstaand werkt gewoon. Maar zodra ik dit doe:
bedrijf toevoeg/edit script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$pass = password_hash(trim($_POST['password']), PASSWORD_DEFAULT)."\n";
$updatecompany = "
UPDATE company c
INNER JOIN users u
ON u.id = c.userid
SET
u.username = '".$username."',
u.password = '".$pass."',
c.name = '".$name."',
c.street = '".$street."',
c.zip = '".$zip."',
c.place = '".$place."',
c.phone = '".$phone."',
c.contact = '".$contact."',
c.email = '".$email."',
c.logo = '".$file."'";
$updatecompanycon = $conn->query($updatecompany);
$updatecompany = "
UPDATE company c
INNER JOIN users u
ON u.id = c.userid
SET
u.username = '".$username."',
u.password = '".$pass."',
c.name = '".$name."',
c.street = '".$street."',
c.zip = '".$zip."',
c.place = '".$place."',
c.phone = '".$phone."',
c.contact = '".$contact."',
c.email = '".$email."',
c.logo = '".$file."'";
$updatecompanycon = $conn->query($updatecompany);
zie ik wel netjes een encrypted password in de database staan, maar inloggen werkt niet. Er staat wachtwoord en gebruikersnaam komen niet overeen.
loginnscript:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$userpassword = $conn->real_escape_string($_POST['userpassword']);
if (password_verify($userpassword, $getuser['password'])) {
if($getuser['username'] == 'admin'){
$redirect = 'http://website.nl/admin';
}else{
$redirect = 'http://website.nl/dashboard';
}
$logindata = array(
'state' => 'success',
'redirect' => $redirect,
);
echo json_encode($logindata);
$_SESSION['userdata']['id'] = $getuser['userid'];
}
if (password_verify($userpassword, $getuser['password'])) {
if($getuser['username'] == 'admin'){
$redirect = 'http://website.nl/admin';
}else{
$redirect = 'http://website.nl/dashboard';
}
$logindata = array(
'state' => 'success',
'redirect' => $redirect,
);
echo json_encode($logindata);
$_SESSION['userdata']['id'] = $getuser['userid'];
}
Hoe kan het dat dit ineens niet werkt? Ik zie de geposte waarde van het form in mijn network tab van Chrome en daar is niks vreemds te zien, gewoon 'test'
wtf?
En ook: je trimt het wachtwoord niet op eenzelfde wijze bij controle.
En ook:
Code (php)
1
2
3
4
2
3
4
<?php
echo json_encode($logindata);
$_SESSION['userdata']['id'] = $getuser['userid'];
?>
echo json_encode($logindata);
$_SESSION['userdata']['id'] = $getuser['userid'];
?>
Eerst output (zonders header()?!) en dan iets naar $_SESSION wegschrijven? :/
Wat ben je allemaal aan het doen man :).
Gewijzigd op 05/07/2018 15:27:05 door Thomas van den Heuvel
Toevoeging op 05/07/2018 15:31:09:
Hoe bedoel je zonder headers? Dit script werkt via AJAX en dat gedeelte werkt gewoon.
En waarom ga je $conn->real_escape_string gebruiken bij een controle? Deze functie hoor je enkel in queries te gebruiken. Nu kan je het wachtwoord zelfs verminken.
Als je JSON output uitspuugt, dan moet je ook de JSON headers gebruiken.
Gewijzigd op 05/07/2018 15:34:13 door - Ariën -
En als je iets in je sessie wilt stoppen, moet je eerst zorgen dat je sessie is gestart/wordt voortgezet middels session_start().
Mijn vraag gaat niet over de sessie e.d. dat werkt allemaal. Puur alleen het encrypt verhaal.
@arien oke logisch ik heb de real_escape_string functie nu in de query zelf geplaatst en weggehaald bij de gepostte waardes.
Zonder database, zonder sessies, zonder redirect.
En kijk wat er gebeurt.
En begrijp wat er gebeurt.
En ga dan dingen stap voor stap uitbouwen.
login.htm
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
33
34
35
36
37
38
39
40
41
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
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AJAX login</title>
<script
src="https://code.jquery.com/jquery-1.12.4.js"
integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU="
crossorigin="anonymous"></script>
</head>
<body>
<form action="#" id="login" method="post">
<input type="text" name="username" autocomplete="off" />
<input type="password" name="password" autocomplete="off" />
<button type="submit">go</button>
</form>
<div id="result"></div>
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
$('#login').submit(function(e) {
e.preventDefault();
$('#result').html(''); // maak inhoud result div tijdelijk leeg
$.post(
'ajax.php',
$('#login').serialize(),
function(data) {
// gooi debug in result div
$('#result').html('success: '+(data.success ? 'yes' : 'no')+', message: '+data.message);
},
'json'
);
});
});
//]]>
</script>
</body>
</html>
<html>
<head>
<meta charset="UTF-8">
<title>AJAX login</title>
<script
src="https://code.jquery.com/jquery-1.12.4.js"
integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU="
crossorigin="anonymous"></script>
</head>
<body>
<form action="#" id="login" method="post">
<input type="text" name="username" autocomplete="off" />
<input type="password" name="password" autocomplete="off" />
<button type="submit">go</button>
</form>
<div id="result"></div>
<script type="text/javascript">
//<![CDATA[
$().ready(function() {
$('#login').submit(function(e) {
e.preventDefault();
$('#result').html(''); // maak inhoud result div tijdelijk leeg
$.post(
'ajax.php',
$('#login').serialize(),
function(data) {
// gooi debug in result div
$('#result').html('success: '+(data.success ? 'yes' : 'no')+', message: '+data.message);
},
'json'
);
});
});
//]]>
</script>
</body>
</html>
ajax.php
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
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
<?php
// start sessie hier als je deze gebruikt
$users = array(
'thomas' => '$2y$10$5QoIWZLpjQnhCtKdo/gIuutBefpFkXrG3K6oeWZyrvLhEcjNlXGYO', // test1
'hennie' => '$2y$10$DFByYCx458qEDGQAOvVyzOTHZlri1oowrNoCxZ.xkBWFIXpxLQgvK', // test2
);
$return = array(
'success' => false,
'message' => 'no cake',
);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) && array_key_exists($_POST['username'], $users) && isset($_POST['password'])) {
if (password_verify($_POST['password'], $users[$_POST['username']])) {
$return = array(
'success' => true,
'message' => 'cake',
);
// stop hier iets in sessie
}
} else {
// geen geldige username, maar voer een dummy test uit zodat hackers niet kunnen vissen naar usernames
// op grond van afwijkende responstijd, ook bij een query die geen resultaat heeft
password_verify('dummy', '$2y$10$ewdBluCzmebd0qPwj/qmP.znuTSDUZWyVN9xQ27sHedCOhV7/28Bu'); // iets dat false oplevert
}
}
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($return);
?>
// start sessie hier als je deze gebruikt
$users = array(
'thomas' => '$2y$10$5QoIWZLpjQnhCtKdo/gIuutBefpFkXrG3K6oeWZyrvLhEcjNlXGYO', // test1
'hennie' => '$2y$10$DFByYCx458qEDGQAOvVyzOTHZlri1oowrNoCxZ.xkBWFIXpxLQgvK', // test2
);
$return = array(
'success' => false,
'message' => 'no cake',
);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) && array_key_exists($_POST['username'], $users) && isset($_POST['password'])) {
if (password_verify($_POST['password'], $users[$_POST['username']])) {
$return = array(
'success' => true,
'message' => 'cake',
);
// stop hier iets in sessie
}
} else {
// geen geldige username, maar voer een dummy test uit zodat hackers niet kunnen vissen naar usernames
// op grond van afwijkende responstijd, ook bij een query die geen resultaat heeft
password_verify('dummy', '$2y$10$ewdBluCzmebd0qPwj/qmP.znuTSDUZWyVN9xQ27sHedCOhV7/28Bu'); // iets dat false oplevert
}
}
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($return);
?>
Bedankt, ik heb mijn code nu anders opgebouwd en het werkend gekregen.