Login check username!
Pagina: « vorige 1 2 3 volgende »
Even snel wat aanpassingen. Bekijk de verschillen. (Niet getest of er typfoutjes in zitten).
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
59
60
61
62
63
64
65
66
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
59
60
61
62
63
64
65
66
<?php
require_once 'config.php';
if($_SERVER['REQUEST_METHOD'] == "POST") {
if(isset($_POST['username'],$_POST['password'])) {
if(!preg_match("/^[a-z ]+$/i",$_POST['username']) || strlen(trim($_POST['username'])) < 1) {
$errors[] = 'Username is empty or incorrect. Only letters and spaces allowed';
}
if(strlen(trim($_POST['password'])) < 6) {
$errors[] = 'Password must contain atleast 6 characters';
}
if(!isset($errors)) {
$query = "
SELECT
username,password
FROM
accounts
WHERE
username = '" . mysqli_real_escape_string($connection, $_POST['username']) . "'
";
$result = mysqli_query($connection, $query);
if($result) {
if(mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
if(crypt($_POST['password'], $row['password']) == $row['password']) {
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (60 * 60 * 60);
header("Location:".$_SERVER['SCRIPT_NAME']);
exit();
} else {
$errors[] = 'Wrong password';
}
} else {
$errors[] = 'Username does not exist';
}
} else {
$errors[] = 'Er is een fout opgetreden. Probeer het later nog eens.';
}
}
}
}
if(isset($errors)) {
foreach($errors AS $error) {
echo $error . '<br />';
}
}
?>
<form method="POST">
<label>Username</label>
<input type="text" name="username" /><br />
<label>Password</label>
<input type="password" name="password" /><br />
<button>Login</button>
</form>
require_once 'config.php';
if($_SERVER['REQUEST_METHOD'] == "POST") {
if(isset($_POST['username'],$_POST['password'])) {
if(!preg_match("/^[a-z ]+$/i",$_POST['username']) || strlen(trim($_POST['username'])) < 1) {
$errors[] = 'Username is empty or incorrect. Only letters and spaces allowed';
}
if(strlen(trim($_POST['password'])) < 6) {
$errors[] = 'Password must contain atleast 6 characters';
}
if(!isset($errors)) {
$query = "
SELECT
username,password
FROM
accounts
WHERE
username = '" . mysqli_real_escape_string($connection, $_POST['username']) . "'
";
$result = mysqli_query($connection, $query);
if($result) {
if(mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
if(crypt($_POST['password'], $row['password']) == $row['password']) {
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (60 * 60 * 60);
header("Location:".$_SERVER['SCRIPT_NAME']);
exit();
} else {
$errors[] = 'Wrong password';
}
} else {
$errors[] = 'Username does not exist';
}
} else {
$errors[] = 'Er is een fout opgetreden. Probeer het later nog eens.';
}
}
}
}
if(isset($errors)) {
foreach($errors AS $error) {
echo $error . '<br />';
}
}
?>
<form method="POST">
<label>Username</label>
<input type="text" name="username" /><br />
<label>Password</label>
<input type="password" name="password" /><br />
<button>Login</button>
</form>
Gewijzigd op 11/03/2014 15:06:00 door Michael -
Erwin H op 11/03/2014 14:32:52:
Beter! Alleen deze regel zou ik anders doen (maar helemaal fout is het niet):
Aangezien $query alleen maar een boolean is als het mislukt, zal $query nooit true worden (in dat geval is het een resource). !$query is dus eigenlijk incorrect, omdat je er dan vanuit gaat dat het true of false is. Logischer is om te controleren of het niet gelijk aan false is op deze manier:
Weet ook het verschil tussen != en !== overigens.
Aangezien $query alleen maar een boolean is als het mislukt, zal $query nooit true worden (in dat geval is het een resource). !$query is dus eigenlijk incorrect, omdat je er dan vanuit gaat dat het true of false is. Logischer is om te controleren of het niet gelijk aan false is op deze manier:
Weet ook het verschil tussen != en !== overigens.
= betekend toch ongeveer 'verandert in'
en == 'is gelijk aan'
Toch?
== is een loose comparison (of != op ongelijkheid)
=== is een strict comparison (of !== op ongelijkheid)
== checkt dus op gelijke waardes, maar eventueel andere types
=== checkt dus op waarde en type
1 == '1' levert true op.
1 === '1' levert false op.
En 1 === 1 levert dan weer true op?
1 === '1' levert false op omdat de eerste een integer is, maar de 2e is een string. Dus ze zijn wel allebei 1 maar niet van het zelfde type.
Gewijzigd op 11/03/2014 14:47:34 door Michael -
Maar....
Wat betekent dit?
Code (php)
1
2
3
4
5
2
3
4
5
<?php
if(!preg_match("/^[a-z ]+$/i",$_POST['username']) || strlen(trim($_POST['username'])) < 1) {
$errors[] = 'Username is empty or incorrect. Only letters and spaces allowed';
}
?>
if(!preg_match("/^[a-z ]+$/i",$_POST['username']) || strlen(trim($_POST['username'])) < 1) {
$errors[] = 'Username is empty or incorrect. Only letters and spaces allowed';
}
?>
Maar even kort
Met preg_match kun je controleren of een variabele match aan een bepaald patroon.
Het patroon in dit geval is /^[a-z ]+$/i
Je moet altijd beginnen en eindigen met een teken (#^[a-z ]+$#i kan ook)
de ^ geeft het begin aan (dus voor alles vanaf het begin geldt dat patroon), en $ het einde (alles tot het einde geldt dat patroon), daar tussen in mogen alleen de letters a t/m z zitten en een spatie [a-z ] de + geeft aan dat dit vaker dan 1 keer mag voorkomen. Zonder die + zal je dus maar 1 letter óf spatie mogen invullen. Die i aan het eind staat voor 'case insensitive' en is daar mee niet hoofdletter gevoelig. Zonder i mag je dus alleen kleine letters invullen.
Gewijzigd op 11/03/2014 14:53:16 door Michael -
Toevoeging op 11/03/2014 14:59:28:
En dit dan?
Code (php)
Waarom already exists want het is geen registreren he:P of is het verkeerde text?
Die error moet dus weg, want het is juist goed.
Code (php)
Edit: heb het eerder geposte script aangepast.
Gewijzigd op 11/03/2014 15:09:24 door Michael -
Blijkt het toch goed te zijn :p
Michael hij geeft nog wel wrong password aan en ik ben 100% zeker dat ik wel de goeie gegevens invul
Is dat niet omdat het script nu nog is afgestemd op registreren ipv, inloggen?
Dit is het inloggen niet het registreren lijkt me want met het registreren hoef je geen sessies te gebruiken:P
Ik zie ook dat het even een snel voorbeeldje heb ;) Heb niks getest, dus kan dat er ergens een foutje zit. Het wachtwoord in de database is ge-encrypt opgeslagen?
ja
ok
Als je het met crypt($_POST['password']) hebt opgeslagen zou die het moeten doen.
Denk eerder dat je fout in het opgeslagen wachtwoord ziet. Bedenk wel dat functies als trim() mysqli_real_escape_string() e.d. ervoor kunnen zorgen dat je wachtwoord anders wordt opgeslagen dat dat je het hebt ingegeven. Probeer het eens zonder deze functies op te slaan en een simpel woord i.p.v vreemde tekens.
Hier dan ook maar even, crypt() gebruiken zonder zelf een 'salt' aan te maken waarin je aangeeft iets (veel) beters te gebruiken dan DES/MD5 is niet aan te raden. Maak het jezelf makkelijk en gebruik password_hash().
@Dos Moonen is dat net zo veilig dan?
Kun je eigenlijk ook je wachtwoord opslaan met wat anders dan MD5? Heb ook wel is gehoord van SHA2 ofzo.