Wachtwoord hashen
Pagina: « vorige 1 2 3 4 volgende »
Btw je moet geen Mysql_ meer gebruiken. gebruik Mysqli_ anders heb je straks een probleem als je webhosting een update geeft aan je huidige php versie.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php // kleurtjes
$password = $_POST['password'];
// controleer hier op minimale lengte, maximale lengte of wat dan ook
$hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 12));
$test = $hash; // of verander '$test' in die query door $hash
?>
$password = $_POST['password'];
// controleer hier op minimale lengte, maximale lengte of wat dan ook
$hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 12));
$test = $hash; // of verander '$test' in die query door $hash
?>
login pagina: include password.php
Code (php)
MD5 is niet aan te raden, zeker niet wanneer je maar 2 iteraties doet in plaats van een paar duizend. password_* functies zijn geschreven door mensen die er meer verstand van hebben dan wij.
Gewijzigd op 08/03/2015 20:13:15 door Dos Moonen
Alleen kan ik nu niet meer inloggen? (invalid password zegt hij):
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
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
<?php
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_connect("localhost", "root","usbw") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
$query = mysql_query("SELECT * from users WHERE username='$username'"); //Query the users table if there are matching rows equal to $username
$exists = mysql_num_rows($query); //Checks if username exists
$table_users = "";
$table_password = "";
if($exists > 0) //IF there are no returning rows or no existing username
{
while($row = mysql_fetch_assoc($query)) //display all rows from query
{
$table_users = $row['username']; // the first username row is passed on to $table_users, and so on until the query is finished
$table_password = $row['password']; // the first password row is passed on to $table_users, and so on until the query is finished
}
if(($username == $table_users) && password_verify($password, $table_password))
{
$_SESSION['user'] = $username; // heb je geen id dat je kan gebruiken? is wat netter
header("location: home.php");
exit();
}
else
{
Print '<script>alert("Incorrect Password!");</script>'; //Prompts the user
Print '<script>window.location.assign("login.php");</script>'; // redirects to login.php
}
}
else
{
Print '<script>alert("Incorrect Username!");</script>'; //Prompts the user
Print '<script>window.location.assign("login.php");</script>'; // redirects to login.php
}
?>
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_connect("localhost", "root","usbw") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
$query = mysql_query("SELECT * from users WHERE username='$username'"); //Query the users table if there are matching rows equal to $username
$exists = mysql_num_rows($query); //Checks if username exists
$table_users = "";
$table_password = "";
if($exists > 0) //IF there are no returning rows or no existing username
{
while($row = mysql_fetch_assoc($query)) //display all rows from query
{
$table_users = $row['username']; // the first username row is passed on to $table_users, and so on until the query is finished
$table_password = $row['password']; // the first password row is passed on to $table_users, and so on until the query is finished
}
if(($username == $table_users) && password_verify($password, $table_password))
{
$_SESSION['user'] = $username; // heb je geen id dat je kan gebruiken? is wat netter
header("location: home.php");
exit();
}
else
{
Print '<script>alert("Incorrect Password!");</script>'; //Prompts the user
Print '<script>window.location.assign("login.php");</script>'; // redirects to login.php
}
}
else
{
Print '<script>alert("Incorrect Username!");</script>'; //Prompts the user
Print '<script>window.location.assign("login.php");</script>'; // redirects to login.php
}
?>
Je hasht hem niet bij de inlog.
Post het resultaat hier, zorg dat je een test password gebruikt :p
Gewijzigd op 08/03/2015 20:32:31 door Dos Moonen
bool(false) array(2) { ["username"]=>string(5)"test1"["password"]=>string(5)"test1"}
Ik ben een idioot... het had tussen 18 & 19 gemoeten, sorry!
array(10) { ["id"]=> string(2) "10" ["username"]=> string(5) "test1" ["password"]=> string(50) "$2y$12$2JQY43uS37k9nbNDgOZdYe3jhu63igEkRfLcaVr1E8Z" ["naam"]=> string(0) "" ["achternaam"]=> string(0) "" ["telefoonnr"]=> string(0) "" ["email"]=> string(0) "" ["straatnaam"]=> string(0) "" ["huisnr"]=> string(1) "0" ["postcode"]=> string(1) "0" } array(2) { ["username"]=> string(5) "test1" ["password"]=> string(5) "test1" }
MySQL heeft een deel van de hash weggegooit...
Nog een vraagje:
$hash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 12));
Wat doet "array('cost' => 12)" feitelijk als ik vragen mag?
Het moet voor Bcrypt een waarde tussen 4 en 31 zijn. 2^12=4096. Die array is optioneel, de standaard cost is 10.
Nu je op een veilige manier wachtwoorden hast stel ik voor dat je switched van mysql_ functies naar de mysqli_ functies zodat je gebruik kunt maken van prepared statements. Het is netter en als je jezelf aanleert om altijd prepared statements te gebruiken is de kans dat je sql injecties mogelijk maakt kleiner.
Gewijzigd op 08/03/2015 21:29:28 door Dos Moonen
Bedankt!
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_connect("localhost", "root","***") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
?>
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_connect("localhost", "root","***") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
?>
De functie mysql_real_escape_string() heeft een database connectie nodig. Niet handig om die te gebruiken voordat je connect. PHP gaat nu zelf proberen zonder password te connecten. Meestal met een foutmelding tot gevolg.
escapen van je password bij het inloggen moet je niet doen trouwens.
Je gebruikt de waarde van $_POST['password'] niet in je query.
Stel het password is ' (alleen een single quote).
Na het escapen is het \'
Daarna haal je het gehaste password op. Dat zou de hash van ' moeten zijn.
Als je daarna de hash van \' bepaalt, is dat niet gelijk.
(tenzij je bij het opslaan van het password natuurlijk dezelfde fout maakt)
Ivo P op 09/03/2015 09:17:51:
De functie mysql_real_escape_string() heeft een database connectie nodig. Niet handig om die te gebruiken voordat je connect. PHP gaat nu zelf proberen zonder password te connecten. Meestal met een foutmelding tot gevolg.
escapen van je password bij het inloggen moet je niet doen trouwens.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_connect("localhost", "root","***") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
?>
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
mysql_connect("localhost", "root","***") or die(mysql_error()); //Connect to server
mysql_select_db("first_db") or die("Cannot connect to database"); //Connect to database
?>
De functie mysql_real_escape_string() heeft een database connectie nodig. Niet handig om die te gebruiken voordat je connect. PHP gaat nu zelf proberen zonder password te connecten. Meestal met een foutmelding tot gevolg.
escapen van je password bij het inloggen moet je niet doen trouwens.
Goede punten. Maar de mysqli extensie gebruiken in combinatie met prepared statements is nog netter. Dan escape je dingen impliciet door waardes als waardes door te geven, niet als delen van de query.
Ivo P op 09/03/2015 09:17:51:
Je gebruikt de waarde van $_POST['password'] niet in je query.
Dat willen we ook helemaal niet, het wachtwoord komt niet verder dan PHP.
Ivo P op 09/03/2015 09:17:51:
Stel het password is ' (alleen een single quote).
Na het escapen is het \'
Daarna haal je het gehaste password op. Dat zou de hash van ' moeten zijn.
Als je daarna de hash van \' bepaalt, is dat niet gelijk.
(tenzij je bij het opslaan van het password natuurlijk dezelfde fout maakt)
Na het escapen is het \'
Daarna haal je het gehaste password op. Dat zou de hash van ' moeten zijn.
Als je daarna de hash van \' bepaalt, is dat niet gelijk.
(tenzij je bij het opslaan van het password natuurlijk dezelfde fout maakt)
Inderdaad niet gewenst.
Quote:
Dat willen we ook helemaal niet, het wachtwoord komt niet verder dan PHP.
dat zeg ik ook niet. Ik constateer alleen dat de reden voor het escapen het gebruik ik een query zou zijn. Aangezien dat niet plaats vindt (prima), is het escapen ook overboedig / ongewenst (zie rest)
Ik denk dat er iets mis is met mijn if else structuur, mogelijk nog iets anders. (mysql zal ik nog aanpassen naar mysqli of pdo) Als ik met de juiste credentials inlog die admin rechten hebben, heb ik geen probleem.
Maar als ik inlog met een gebruikersnaam die niet bestaat, krijg ik gewoon en wit scherm. Hetzelfde als ik inlog met een acccount die wel bestaat maar geen admin is?
Alvast bedankt!
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
42
43
44
45
46
47
48
49
50
51
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
42
43
44
45
46
47
48
49
50
51
<?php
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$bool = true;
mysql_connect("localhost", "ok", "ok") or die (mysql_error());
mysql_select_db("first_db") or die ("Cannot connect to database");
$query = mysql_query("Select * from users WHERE username='$username'");
$exists = mysql_num_rows($query);
$table_users = "";
$table_password = "";
if($exists > 0)
{
while($row = mysql_fetch_assoc($query))
{
$table_users = $row['username'];
$table_password = $row['password'];
$admin = $row['admin'];
}
if (($admin =="azert"))
{
if(($username == $table_users) && ($password == $table_password) && ($admin == "azert"))
{
if($password == $table_password)
{
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");
}
else
{
Print '<script>alert("Incorrect username!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}
}
else
{
Print '<script>alert("Incorrect Password!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}
}
else
{
Print '<script>alert("Acces denied!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}}
?>
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$bool = true;
mysql_connect("localhost", "ok", "ok") or die (mysql_error());
mysql_select_db("first_db") or die ("Cannot connect to database");
$query = mysql_query("Select * from users WHERE username='$username'");
$exists = mysql_num_rows($query);
$table_users = "";
$table_password = "";
if($exists > 0)
{
while($row = mysql_fetch_assoc($query))
{
$table_users = $row['username'];
$table_password = $row['password'];
$admin = $row['admin'];
}
if (($admin =="azert"))
{
if(($username == $table_users) && ($password == $table_password) && ($admin == "azert"))
{
if($password == $table_password)
{
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");
}
else
{
Print '<script>alert("Incorrect username!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}
}
else
{
Print '<script>alert("Incorrect Password!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}
}
else
{
Print '<script>alert("Acces denied!");</script>';
Print '<script>window.location.assign("login.php");</script>';
}}
?>
Gewijzigd op 09/03/2015 13:17:07 door Ronnie Peeters
Inloggen is om te bepalen WIE een anonieme gebruiker zou kunnen zijn. Alle gebruikers zijn in den beginne anoniem maar we willen niet dat iedereen overal zomaar bij kan. Daarom willen we gebruikers identificeren aan de hand van een gebruikersnaam/email en wachtwoord.
Daarna is een anonieme gebruiker in eens een bekende gebruiker geworden en kunnen we uit de database lezen welke rechten (of rollen) de gebruiker heeft.
Bovenstaande brengt ons op het logische punt dat je altijd eerst gaat inloggen om de identiteit te achterhalen van de gebruikers en pas daarna ga je bepalen welke rechten ze hebben.
dus:
Code (php)
Toevoeging op 09/03/2015 14:00:11:
Ik zou je foutmeldingen beperken tot 'Combinatie van gebruikersnaam en wachtwoord onjuist.'. Dit om hackers niet de informatie te geven dat ze bijvoorbeeld de gebruikersnaam al geraden hebben.
Toevoeging op 09/03/2015 14:05:04:
Een access denied pagina zou ik hooguit tonen aan gebruikers die
a) reeds ingelogd zijn
b) onvoldoende rechten hebben om de pagina te bekijken
Deze pagina mag ook een normale webpagina zijn die netjes de mededeling 'Onvoldoende rechten' laat zien.
Voor gebruikers die niet zijn ingelogd zou ik doorsturen naar de loginpagina.
Ronnie Peeters op 09/03/2015 13:15:12:
Ik denk dat er iets mis is met mijn if else structuur, mogelijk nog iets anders. (mysql zal ik nog aanpassen naar mysqli of pdo) Als ik met de juiste credentials inlog die admin rechten hebben, heb ik geen probleem.
En daarnaast is je if/else-structuur inderdaad niet goed. Verbeter je het inspringen, dan zie je dat if ($admin == "azert") bij false (dus de gebruiker is geen admin) altijd eindigt in inloggen:
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
if ($exists > 0) {
while($row = mysql_fetch_assoc($query)) {
$table_users = $row['username'];
$table_password = $row['password'];
$admin = $row['admin'];
}
if ($admin == "azert") {
if(($username == $table_users) && ($password == $table_password) && ($admin == "azert")) {
if ($password == $table_password) {
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");
} else {
print '<script>alert("Incorrect username!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Incorrect Password!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Acces denied!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
}
?>
if ($exists > 0) {
while($row = mysql_fetch_assoc($query)) {
$table_users = $row['username'];
$table_password = $row['password'];
$admin = $row['admin'];
}
if ($admin == "azert") {
if(($username == $table_users) && ($password == $table_password) && ($admin == "azert")) {
if ($password == $table_password) {
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");
} else {
print '<script>alert("Incorrect username!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Incorrect Password!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Acces denied!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
}
?>
Code (php)
Alvast bedankt!
bij de header() functie geef je aan dat de client doorgestuurd wordt maar hiermee wordt het script nog niet beëindigd. Je script loopt na het wijzigen van de headers (dat een onderdeel is van je response) gewoon door omdat er ook gewoon content meegegeven kan worden wat enkel bij een redirect geen zin heeft.