help blowfish
Pagina: « vorige 1 2 3 volgende »
Bart V B op 21/09/2014 16:52:16:
Zoals je ziet heb je nooit een zelfde hash. Dat is ook de bedoeling.
Maar volgens mij heb je mijn tweede voorbeeld niet gebruikt anders had je gezie dat het wel werkt.
Maar volgens mij heb je mijn tweede voorbeeld niet gebruikt anders had je gezie dat het wel werkt.
ja
maar ik snap het gwn echt niet dat
het is me dan wel gelukt voor een registatie pagina te maken
maar inloggen niet
Laat je code van registreren en login eens zien wat je nu hebt.
registreren
[spoiler]
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
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
<?php
require_once("config.php");
if(isset($_POST['hidden']) && $_POST['hidden'] ==1){
$username = $mysqli->real_escape_string($_POST['username']);
$password = $mysqli->real_escape_string($_POST['password']);
$password2 =$mysqli->real_escape_string($_POST['password2']);
if ($password == $password2){
$sql1 = $mysqli->query("SELECT username from user WHERE username='".$username."'");
if($sql1->num_rows == 1){
echo"bestaat al";
}else{
$sql3 = $mysqli->query( "INSERT INTO user (`username`, `password`) VALUES ('".$username."','".password_hash($password, CRYPT_BLOWFISH)."')");
}
}else{
echo "passworden komen niet overeen";
}
}
?>
<html>
<head><title>registeer</title></head>
<body>
<form action='registeer.php' method='post'>
username:<input type='text'name='username'/> <br />
password: <input type='password'name='password' /> <br />
password retype: <input type='password'name='password2' /> <br />
<input type='hidden' name='hidden' value=1>
<input type='submit' value='registeer'>
</form>
</body>
</html>
require_once("config.php");
if(isset($_POST['hidden']) && $_POST['hidden'] ==1){
$username = $mysqli->real_escape_string($_POST['username']);
$password = $mysqli->real_escape_string($_POST['password']);
$password2 =$mysqli->real_escape_string($_POST['password2']);
if ($password == $password2){
$sql1 = $mysqli->query("SELECT username from user WHERE username='".$username."'");
if($sql1->num_rows == 1){
echo"bestaat al";
}else{
$sql3 = $mysqli->query( "INSERT INTO user (`username`, `password`) VALUES ('".$username."','".password_hash($password, CRYPT_BLOWFISH)."')");
}
}else{
echo "passworden komen niet overeen";
}
}
?>
<html>
<head><title>registeer</title></head>
<body>
<form action='registeer.php' method='post'>
username:<input type='text'name='username'/> <br />
password: <input type='password'name='password' /> <br />
password retype: <input type='password'name='password2' /> <br />
<input type='hidden' name='hidden' value=1>
<input type='submit' value='registeer'>
</form>
</body>
</html>
[/spoiler]
Of heb je toch nog wat weggelaten?
ik denk tog dat er nog wat foutjes in zitten maar het werkt wel;:)
Ik dacht dat je een stuk code had weggelaten, ook omdat je na $sql1 ineens $sql3 hebt en er nergens een $sql2 te vinden is...
iemand die dat dat fouten op kon leveren
Toevoeging op 21/09/2014 17:36:51:
maar ff tot zaken
kan jullie helpen met login script?
Heb je al iets geprobeerd met Barts code? Verder plaats je al alles goed gevalideerd is een sessie.
en ja maar kwam er niet egt uit om het in me login te bouwen
en heb hem verwijder dus moet hem zo ff op nieuw maken
Let a.u.b. ook even op je taalgebruik. We zitten op een forum en niet op Whatsapp waar je verkortte woorden als 'egt' gebruikt.
Gewijzigd op 21/09/2014 21:35:00 door - Ariën -
login.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
52
53
54
55
56
57
58
<?php
session_start();
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
trigger_error('Fout bij verbinding: '.$mysqli->error);
}
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
$options = [
'cost' => 10
];
$username = $mysqli->real_escape_string($_POST['username']);
$sql = "SELECT username FROM user WHERE username= '".$username."' AND password = '".password_hash($_POST['password'], PASSWORD_BCRYPT, $options)."'";
if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
if( $result->num_rows > 0 )
{
// session aanmaken
$_SESSION['loggedin'] = true;
// doorsturen naar beveiligde pagina
header('Location: beveiligdepagina.php');
exit();
}
else
{
echo 'Login gegevens kloppen niet.';
}
}
}
?>
<html>
<head><title>Login</title></head>
<body>
<form action="login.php" method="post">
username: <input type="text" name="username" /> <br />
password: <input type="password" name="password" /> <br />
<input type="submit" value="registeer">
</form>
</body>
</html>
session_start();
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
trigger_error('Fout bij verbinding: '.$mysqli->error);
}
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
$options = [
'cost' => 10
];
$username = $mysqli->real_escape_string($_POST['username']);
$sql = "SELECT username FROM user WHERE username= '".$username."' AND password = '".password_hash($_POST['password'], PASSWORD_BCRYPT, $options)."'";
if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
if( $result->num_rows > 0 )
{
// session aanmaken
$_SESSION['loggedin'] = true;
// doorsturen naar beveiligde pagina
header('Location: beveiligdepagina.php');
exit();
}
else
{
echo 'Login gegevens kloppen niet.';
}
}
}
?>
<html>
<head><title>Login</title></head>
<body>
<form action="login.php" method="post">
username: <input type="text" name="username" /> <br />
password: <input type="password" name="password" /> <br />
<input type="submit" value="registeer">
</form>
</body>
</html>
Gewijzigd op 23/09/2014 16:58:08 door Sam van Broemsen
Een professionele productieomgeving stel je zó in dat elke kritieke error of exception centraal wordt afgehandeld en in een log verschijnt. Dáár bepaal je vervolgens ook wat de gebruiker ervan te zien krijgt, bijvoorbeeld een foutmelding.
Ward van der Put op 23/09/2014 17:04:43:
Sam, er staat geen echo voor, hè.
Een professionele productieomgeving stel je zó in dat elke kritieke error of exception centraal wordt afgehandeld en in een log verschijnt. Dáár bepaal je vervolgens ook wat de gebruiker ervan te zien krijgt, bijvoorbeeld een foutmelding.
Een professionele productieomgeving stel je zó in dat elke kritieke error of exception centraal wordt afgehandeld en in een log verschijnt. Dáár bepaal je vervolgens ook wat de gebruiker ervan te zien krijgt, bijvoorbeeld een foutmelding.
Een foutmelding laten zien is prima,
Maar om alle informatie over de fout te laten zien is een beetje overbodig en komt onprofessioneel over. Wanneer mensen bij Google een foutje maken en er misschien een MySQL-Error komt, dan is de fout toch ook niet meteen zichtbaar?
Dat doet trigger_error() in het voorbeeld van Bart ook helemaal niet. trigger_error() laat het PHP-script een user error gooien. Wat je daarmee vervolgens doet, is aan jou.
Ik maak al lang genoeg scripts om te weten hoe het wel en niet moet.
Op of aanmerkingen betreft mijn voorbeeld zijn prima. Maar laat het dan ook zien met een beter voorbeeld en kijk dan eerst even wat een ding doet zoals trigger_error().
Bart V B op 23/09/2014 09:31:44:
Zal een keer je laten zien hoe je het ongeveer moet doen:
login.php
login.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
52
53
54
55
56
57
58
<?php
session_start();
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
trigger_error('Fout bij verbinding: '.$mysqli->error);
}
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
$options = [
'cost' => 10
];
$username = $mysqli->real_escape_string($_POST['username']);
$sql = "SELECT username FROM user WHERE username= '".$username."' AND password = '".password_hash($_POST['password'], PASSWORD_BCRYPT, $options)."'";
if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
if( $result->num_rows > 0 )
{
// session aanmaken
$_SESSION['loggedin'] = true;
// doorsturen naar beveiligde pagina
header('Location: beveiligdepagina.php');
exit();
}
else
{
echo 'Login gegevens kloppen niet.';
}
}
}
?>
<html>
<head><title>Login</title></head>
<body>
<form action="login.php" method="post">
username: <input type="text" name="username" /> <br />
password: <input type="password" name="password" /> <br />
<input type="submit" value="registeer">
</form>
</body>
</html>
session_start();
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
trigger_error('Fout bij verbinding: '.$mysqli->error);
}
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
$options = [
'cost' => 10
];
$username = $mysqli->real_escape_string($_POST['username']);
$sql = "SELECT username FROM user WHERE username= '".$username."' AND password = '".password_hash($_POST['password'], PASSWORD_BCRYPT, $options)."'";
if(!$result = $mysqli->query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
if( $result->num_rows > 0 )
{
// session aanmaken
$_SESSION['loggedin'] = true;
// doorsturen naar beveiligde pagina
header('Location: beveiligdepagina.php');
exit();
}
else
{
echo 'Login gegevens kloppen niet.';
}
}
}
?>
<html>
<head><title>Login</title></head>
<body>
<form action="login.php" method="post">
username: <input type="text" name="username" /> <br />
password: <input type="password" name="password" /> <br />
<input type="submit" value="registeer">
</form>
</body>
</html>
moet
password_hash
password_verify
zijn?
Een hash kan nooit het zelfde zijn.
Je moet de wachtwoorden uit de db halen waarvan de gebruikersnaam $_POST['username'] is.
Dan doe je if (password_verify($_POST['username'], $passwordvandb)) : echo "Jippie!"; else : "Mwahh.. Niet gelukt."; endif;
En als dat nog te moeilijk is, dan vraag ik je om eerst de basis van if statements te leren, of eerst een inlogsysteem maken zonder iets gehasht. Dit is echter wel heel onveilig, maar het is waarschijnlijk wel handig om te weten hoe een inlogsysteem werkt.
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
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
<?php
require "config.php";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_POST['username'] == NULL) {
$login_error = "username in vullen aub";
}
if ($_POST['password'] == NULL) {
$login_error = "password invullen aub";
}
if (isset($_POST['password']) && isset($_POST['username'])) {
$username = $mysqli->real_escape_string($_POST['username']);
$password = CRYPT_BLOWFISH;
$query = $mysqli->query("SELECT * FROM user WHERE username = ".$username." AND password = ".$password." LIMIT 1");
if ($query->num_rows == 1) {
$row = $query->fetch_assoc();
$_SESSION['loggedin'] = TRUE;
$_SESSION['username'] = $_POST['username'];
$_SESSION['uid'] = $row['id'];
header("location: member.php");
} else {
header('Location: index.php');
echo "user bestaat niet";
exit;
}
}
}
?>
<html>
<head>
<title>Inloggen</title>
</head>
<body>
<form method="POST">
<?php if(isset($username) == TRUE){ echo $username; }else{echo "username";}?>: <input type="text" name="username"><br>
<?php if(isset($password) == TRUE){ echo $password; }else{echo "password";}?>: <input type="password" name="password"><br>
<input type="submit" value="<?php echo "login " ?>"><br>
</form>
</body>
</html>
[/code/
require "config.php";
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_POST['username'] == NULL) {
$login_error = "username in vullen aub";
}
if ($_POST['password'] == NULL) {
$login_error = "password invullen aub";
}
if (isset($_POST['password']) && isset($_POST['username'])) {
$username = $mysqli->real_escape_string($_POST['username']);
$password = CRYPT_BLOWFISH;
$query = $mysqli->query("SELECT * FROM user WHERE username = ".$username." AND password = ".$password." LIMIT 1");
if ($query->num_rows == 1) {
$row = $query->fetch_assoc();
$_SESSION['loggedin'] = TRUE;
$_SESSION['username'] = $_POST['username'];
$_SESSION['uid'] = $row['id'];
header("location: member.php");
} else {
header('Location: index.php');
echo "user bestaat niet";
exit;
}
}
}
?>
<html>
<head>
<title>Inloggen</title>
</head>
<body>
<form method="POST">
<?php if(isset($username) == TRUE){ echo $username; }else{echo "username";}?>: <input type="text" name="username"><br>
<?php if(isset($password) == TRUE){ echo $password; }else{echo "password";}?>: <input type="password" name="password"><br>
<input type="submit" value="<?php echo "login " ?>"><br>
</form>
</body>
</html>
[/code/
password_hash() is op het moment van schrijven een wrapper om de crypt() functie handige defaults. Dit komt omdat de enige mode die er nu voor bestaat PASSWORD_BCRYPT is. In de toekomstige PHP versies kunnen er nieuwe modi bij komen en kan de default ook veranderen.
password_hash() heeft drie parameters, waarvan maar één verplicht is.
- het wachtwoord
- optioneel: de modus
- optioneel: modus specifieke opties
De standaard modus is op het moment de enige modus: PASSWORD_BCRYPT.
De opties voor de modus PASSWORD_BCRYPT zijn de 'cost' en de 'salt'.
De cost is een waarde van 4 tot en met 31. 2 to de macht 'cost' is het aantal hash iteraties dat wordt gedaan. Stel dit zo in dat het 100-300 milliseconden duurt voor het hashen van een wachtwoord. Dat is snel genoeg voor één succesvolle login, maar traag genoeg om (offline) bruteforce aanvallen miljarden euro's te laten kosten en je dus de user de schuld kan geven omdat het een slecht wachtwoord heeft gekozen als het gekraakt wordt.
De salt wil je eigenlijk nooit zelf instellen, de standaard manier genereert die namelijk op een veilige manier. Don't try this at home, unless you are an expert.
De bedoeling van een salt is om te zorgen dat wanneer gebruikers het zelfde wachtwoord te hebben ze niet ook nog eens de zelfde hash hebben. Salts horen dus uniek te zijn. Je zou dit in theorie kunnen forceren door zelf salt in te stellen maar in de praktijk is dit het niet waard.
Doordat salts dus telkens gegenereerd worden zal er dus telkens een nieuwe hash gegenereerd worden, ook al hash je telkens het zelfde wachtwoord.
Maar je hebt natuurlijk wel de originele salt nodig om er achter te komen of het ingevoerde wachtwoord de zelfde hash oplevert. Dat is de reden dat de salt in de hash verwerkt zit, net als de cost aangezien deze ook invloeg heeft op de uiteindelijke hash.
Dus het resultaat van bcrypt is eigenlijk geen hash omdat de hash maar een deel is van het resultaat.
Een username en wachtwoord is dus genoeg input van de gebruiker om te controleren of de gebruiker wel is wie hij/zij zegt dat hij is:
1) Probeer het resultaat van password_hash() dat is opgeslagen in dat database op te halen met een query waar de username in verwerkt is.
2) Als er geen user met die username gevonden is weergeef je een error.
3) Als er wel een user is met die username heb je dus je password_hash() resultaat dat de cost, salt en hash bevat.
4) Voer password_verify() de door de gebruiker opgegeven password en het password_hash() resultaat.
5) Weergeef een error als het resultaat van password_verify() FALSE is.
6) Log de gebruiker in als het resultaat van password_verify() TRUE is.
Wat er dus fout is aan het bovenstaande script is dat de query kijkt of het wachtwoord '1' is. Haal alles vanaf 'AND'. LIMIT 1 mag op zich blijven.
Er is geen if waar je controleert wat het resultaat van password_verify($POST['password'], $row['password']) is.
Voor de rest kunnen er nog dingen netter:
- geen star-select, selecteer alleen het veld password.
- gebruik op regels 4 en 7 !isset($POST['blabla']) en niet $POST['blabla'] == NULL
- een exit na regel 26.
- regels 43 en 44 zijn alleen om te testen neem ik aan? Het wachtwoord in HTML proberen te zetten is geen goed idee namelijk. Sowieso hoort heel die $password variabele weg te kunnen.