Password verify functie werkt niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

05/07/2018 15:12:58
Quote Anchor link
Ik zit met een vreemd probleem.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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.';
}


Bovenstaand werkt gewoon. Maar zodra ik dit doe:

bedrijf toevoeg/edit script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);


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)
PHP script in nieuw venster Selecteer het PHP script
1
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'];
}



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'
 
PHP hulp

PHP hulp

18/04/2024 02:46:34
 
Thomas van den Heuvel

Thomas van den Heuvel

05/07/2018 15:23:40
Quote Anchor link
Je plakt een nieuwe lijn karakter (\n) aan je wachtwoord?

wtf?

En ook: je trimt het wachtwoord niet op eenzelfde wijze bij controle.

En ook:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
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
 
Snelle Jaap

Snelle Jaap

05/07/2018 15:27:15
Quote Anchor link
Dat stond bij een veel geupvote antwoord op stackoverflow dus ik ging er van uit dat dat goed was. Gewoon weghalen dus? Zonder die nieuwe lijn werkt het trouwens nog steeds niet.

Toevoeging op 05/07/2018 15:31:09:

Hoe bedoel je zonder headers? Dit script werkt via AJAX en dat gedeelte werkt gewoon.
 
- Ariën  -
Beheerder

- Ariën -

05/07/2018 15:31:33
Quote Anchor link
Als ik een geupvoted antwoord op Stack Overflow tegenkom, dan kijk ik altijd of het goed is, en of het aan mijn verwachtingen voldoet. Ik ga nooit op voorhand zomaar code kopiëren en plakken zonder te weten wat het doet.

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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

05/07/2018 15:37:09
Quote Anchor link
En als je iets in je sessie wilt stoppen, moet je eerst zorgen dat je sessie is gestart/wordt voortgezet middels session_start().
 
Snelle Jaap

Snelle Jaap

05/07/2018 15:39:26
Quote Anchor link
Dat doe ik maar het leek me overbodig het hele script te plaatsen aangezien er een hoop onrelevante code tussenstaat.
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

05/07/2018 16:09:59
Quote Anchor link
Begin eens simpel.

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)
PHP script in nieuw venster Selecteer het PHP script
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
<!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>


ajax.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>
 
Snelle Jaap

Snelle Jaap

09/07/2018 09:48:32
Quote Anchor link
Bedankt, ik heb mijn code nu anders opgebouwd en het werkend gekregen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.