Opschonen loginscript
Ik heb ooit van -aar- haar loginscript gebruikt, en daar telkens op verder gebouwd.
Nu vind ik het script wat ... , niet echt mooi, overzichtelijk etc.
Ik zou graag jullie mening hebben wat er eigenlijk beter aan kan? Hoe ik het 'mooier' kan maken etc.
Hoe zouden jullie het doen?
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
67
68
69
70
71
72
73
74
75
76
77
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
67
68
69
70
71
72
73
74
75
76
77
<?php
# Als er op submit gedrukt is.
if(($_SERVER['REQUEST_METHOD'] == "POST") && (isset($_POST['login']))) {
# Als de waarden niet leeg zijn.
if(!empty($_POST['username']) OR !empty($_POST['password'])) {
# We gaan nu alle gegevens ophalen van de username die ingevuld is.
$sql_geg = "SELECT * FROM leden WHERE username = '".mysql_real_escape_string($_POST['username'])."'";
# We gaan controleren of de query gelukt is, en of er resultaten zijn.
if(mysql_num_rows(mysql_query($sql_geg))) {
# De query is gelukt, dus nu zullen we de gegevens beschikbaar maken.
$row_user = mysql_fetch_assoc(mysql_query($sql_geg));
# We slaan het wachtwoord niet gewoon op, maar hebben hem versleuteld.
$pass = ''.$_POST['password'].''.$salt.''.$row_user['mail'].'';
# Als het wachtwoord gelijk is...
if(sha1($pass) == $row_user['password']) {
# Kijken of de gebruiker een ban heeft.
if($row_user['ban'] == "0") {
// Ingelogd
$hash = md5(uniqid(rand(), true)); # unique hash.
$insert_session = mysql_query("INSERT INTO sessions (userid, hash, ip, logintime, web) VALUES ('".$row_user['id']."','".$hash."', '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."', NOW(), '".mysql_real_escape_string($row_user['web'])."' )"); # We gaan een sessie plaatsen.
mysql_query("UPDATE leden SET last_actif = DATE_ADD(NOW(), INTERVAL 6 HOUR), last_ip = '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."' WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".sha1($pass)."'");
if(!isset($_POST['onthoud'])) {
if ($insert_session) {
setcookie ("id", $row_user['id'],time()+3600);
setcookie ("hash", $hash,time()+3600);
setcookie ("web", $row_user['web'],time()+3600);
header('location: ingelogd.php?p=home');
exit();
}
else
{
echo "Fout in de query: ".mysql_error();
exit();
}
}
else {
if ($insert_session) {
setcookie ("id", $row_user['id'],time()+36000000);
setcookie ("hash", $hash,time()+36000000);
setcookie ("web", $row_user['web'],time()+36000000);
header('location: ingelogd.php?p=home');
exit();
}
else
{
echo "Fout in de query: ".mysql_error();
exit();
}
}
}
else {
$bericht = '<b>Je account is niet geactiveerd.<br></b>';
}
}
else {
$bericht = '<b>Je inloggegevens komen niet overeen met wat in de database staan. #1</b>'.sha1($pass).' - - - '.$row_user['password'];
}
}
else {
$bericht = '<b>Je inloggegevens komen niet overeen met wat in de database staan. #2</b>'.mysql_error();
}
}
else {
$bericht = '<b>U hebt 1 of meerdere velden niet correct ingevoerd.</b>';
}
}
?>
# Als er op submit gedrukt is.
if(($_SERVER['REQUEST_METHOD'] == "POST") && (isset($_POST['login']))) {
# Als de waarden niet leeg zijn.
if(!empty($_POST['username']) OR !empty($_POST['password'])) {
# We gaan nu alle gegevens ophalen van de username die ingevuld is.
$sql_geg = "SELECT * FROM leden WHERE username = '".mysql_real_escape_string($_POST['username'])."'";
# We gaan controleren of de query gelukt is, en of er resultaten zijn.
if(mysql_num_rows(mysql_query($sql_geg))) {
# De query is gelukt, dus nu zullen we de gegevens beschikbaar maken.
$row_user = mysql_fetch_assoc(mysql_query($sql_geg));
# We slaan het wachtwoord niet gewoon op, maar hebben hem versleuteld.
$pass = ''.$_POST['password'].''.$salt.''.$row_user['mail'].'';
# Als het wachtwoord gelijk is...
if(sha1($pass) == $row_user['password']) {
# Kijken of de gebruiker een ban heeft.
if($row_user['ban'] == "0") {
// Ingelogd
$hash = md5(uniqid(rand(), true)); # unique hash.
$insert_session = mysql_query("INSERT INTO sessions (userid, hash, ip, logintime, web) VALUES ('".$row_user['id']."','".$hash."', '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."', NOW(), '".mysql_real_escape_string($row_user['web'])."' )"); # We gaan een sessie plaatsen.
mysql_query("UPDATE leden SET last_actif = DATE_ADD(NOW(), INTERVAL 6 HOUR), last_ip = '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."' WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".sha1($pass)."'");
if(!isset($_POST['onthoud'])) {
if ($insert_session) {
setcookie ("id", $row_user['id'],time()+3600);
setcookie ("hash", $hash,time()+3600);
setcookie ("web", $row_user['web'],time()+3600);
header('location: ingelogd.php?p=home');
exit();
}
else
{
echo "Fout in de query: ".mysql_error();
exit();
}
}
else {
if ($insert_session) {
setcookie ("id", $row_user['id'],time()+36000000);
setcookie ("hash", $hash,time()+36000000);
setcookie ("web", $row_user['web'],time()+36000000);
header('location: ingelogd.php?p=home');
exit();
}
else
{
echo "Fout in de query: ".mysql_error();
exit();
}
}
}
else {
$bericht = '<b>Je account is niet geactiveerd.<br></b>';
}
}
else {
$bericht = '<b>Je inloggegevens komen niet overeen met wat in de database staan. #1</b>'.sha1($pass).' - - - '.$row_user['password'];
}
}
else {
$bericht = '<b>Je inloggegevens komen niet overeen met wat in de database staan. #2</b>'.mysql_error();
}
}
else {
$bericht = '<b>U hebt 1 of meerdere velden niet correct ingevoerd.</b>';
}
}
?>
Mvg,
Diov
Gewijzigd op 29/06/2013 12:00:35 door - Diov -
Iemand ideeën hoe dit beter kan?
Haal de enters weg :D en plak wat dingen aan elkaar
Anyway, dit is dus MultiSess, één van mijn script die in in 2007 uit heb gebracht om mensen veilig te laten inloggen, met een sessiekeuze.
Leuk script, maar helaas behoorlijk verouderd.
Wat er mis is tegenwoordig:
- Goede beveiliging met sha1() of liever zelfs bcrypt
- Natuurlijk de foutafhandeling
Ik zie dat je al sha1() gebruikt, met een salt. Een stuk beter ;-)
- Aar - op 09/07/2013 19:18:36:
Ben ik een 'haar'? Ik geloof toch echt dat ik van het mannelijk geslacht ben ;-)
offtopic: 't zal aan je avatar liggen :) . ik heb het ook even gedacht. Sorry
- Ik gebruik een salt en pepper. (De salt is een unieke string, en de pepper een waarde van de gebruiker uit de database).
Bcrypt kan ik niet gebruiken, 000webhost laat het niet toe.
De sessiekeuze heb ik eruit gewerkt. Alvast heel erg bedankt dat ik het mocht gebruiken!
@Pepijn,
De enters zorgen ervoor dat het wat meer leesbaar is.
Ik geef toe, misschien wat te veel.
Lijn twintig heeft iets te veel tabs. Ik geloof dat het ook zo in mijn script zit. ;-)
Idd, maar dat vind in nu net handig, ik weet dat in die blok de gebruiker zeker ingelogd is. :p
- Diov - op 09/07/2013 21:47:18:
Idd, maar dat vind in nu net handig, ik weet dat in die blok de gebruiker zeker ingelogd is. :p
Daar heb je ook commentaarblokken voor.
- Diov - op 29/06/2013 11:51:54:
Beste,
Ik heb ooit van -aar-haar loginscript gebruikt
Ik heb ooit van -aar-
Zo, opgelost.
________________________________________________________________________
Zijn er ook nog dingen die anders kunnen?
Ik sla nu de sessie op in de database, maar is het verstandig om ook te kijken naar het IP adres?
Zo kan ik ook beter controleren?
Slaan jullie ook de browser op? Van waar ze inloggen?
Is er misschien de mogelijkheid om de locatie te weten als iemand inlogd? Zoals bij een iPhone (idk voor andere toestellen) de locatievoorziening.
Alvast bedankt.
- Diov - op 09/07/2013 22:53:27:
@Ozzie ?
Ik had van "haar" "aar" gemaakt :)
Ozzie PHP op 09/07/2013 23:50:29:
Ik had van "haar" "aar" gemaakt :)
- Diov - op 09/07/2013 22:53:27:
@Ozzie ?
Ik had van "haar" "aar" gemaakt :)
Ahzo, ik had niet gezien dat het doorstreept was :p nu snap ik Hem :)
Is dat de van de submit knop?
- Diov - op 09/07/2013 22:53:27:
Is er misschien de mogelijkheid om de locatie te weten als iemand inlogd? Zoals bij een iPhone (idk voor andere toestellen) de locatievoorziening.
Precieze locatie bij mijn weten niet, maar op basis van het ip address kan je wel het land bepalen. Hier kan je een complete ip-land database downloaden: http://software77.net/geo-ip/
Als je het loginscript overigens overzichtelijker wil maken zou ik ervoor kiezen om niet al die if statements te nesten. Nu heb je ze tot 7 lagen diep genest, dat is wel heel erg veel.
Dat is de name van het <form>
Als je meerdere formulieren hebt, is het leuk te weten welke verzonden is :p
@Erwin,
En is die locatie weten handig? Ik gebruik ook google analytics, en daar kan ik het ook zien. (Wel niet per gebruiker..)
Hoe werk je de if statements dan weg? Met een switch? Hmm..
Dan verkies ik om zo'n data in een <input type="hidden"> te steken. Daar kan je alles kwijt wat je in $_POST-variabelen wil controleren.
- Diov - op 09/07/2013 22:53:27:
Is er misschien de mogelijkheid om de locatie te weten als iemand inlogd?
Je kan het ook vriendelijk vragen met javascript
Zie bv. http://www.w3schools.com/html/html5_geolocation.asp
en dat resultaat doorsturen naar de server.
Gewijzigd op 10/07/2013 12:29:01 door Kris Peeters