Beveiligde login, en registratie.
Leuke en uitbreidbare login script en registratie.
Je kunt zelf een pass vergeten script maken etc.
Bevat onderranderen aan beveiliging:
- Beveiliging tegen sql injectie.
- Salt + sha1 opslag van wachtwoorden.
- 'Goede' fout afhandeling.
uwx3g.php is de salt pagina.(BRON Vvd. salt.: http://www.phphulp.nl/php/script/beveiliging/salt/1286/)
Gesponsorde koppelingen
PHP script bestanden
46 reacties op 'Beveiligde login, en registratie.'
Gesponsorde koppelingen
Even een Vraagje,
Aan gezien ik net begonnen ben met php. Wat zoude jullie op de login verwerkings pagina toevoegen bijvoorbeeld sessie's of cookie's. Maar hoe pak je dit het beste aan? Liefst gewoon beetje uitleg in een duidelijke taal voor beginners. ben ook al druk aan het zoeken gewest op internet en in mijn boek: 'basis cursus php 5' van Peter Kassenaar, maar wil graag jullie mening?
Mvg Joey
Aan gezien ik net begonnen ben met php. Wat zoude jullie op de login verwerkings pagina toevoegen bijvoorbeeld sessie's of cookie's. Maar hoe pak je dit het beste aan? Liefst gewoon beetje uitleg in een duidelijke taal voor beginners. ben ook al druk aan het zoeken gewest op internet en in mijn boek: 'basis cursus php 5' van Peter Kassenaar, maar wil graag jullie mening?
Mvg Joey
Op een paar schoonhijds foutjes na is het best een leuk script, ik zou nog even aan het volgende iets doen:
- MySql foutafhandeling
- commentaar toevoegen, snapt iedereen wat er gebeurt
- Ik zou alles gewoon 1 voor 1 checken en dan opvangen met een foreach loop, dat scheelt je heel wat header functies en je if statements staan niet zo in elkaar.
- Bij registreren kijken of de gebruiker al bestaat, dit gebeurt nog niet volgens mij..
- Datum in een query doe je met NOW()
- MySql foutafhandeling
- commentaar toevoegen, snapt iedereen wat er gebeurt
- Ik zou alles gewoon 1 voor 1 checken en dan opvangen met een foreach loop, dat scheelt je heel wat header functies en je if statements staan niet zo in elkaar.
- Bij registreren kijken of de gebruiker al bestaat, dit gebeurt nog niet volgens mij..
- Datum in een query doe je met NOW()
@Milo
Bedankt voor je reactie. Leuk dat je er zo over denkt.
Ik ben nog maar een maand of 3 bezig met php.(niet actief af en toe iets.)
Er wordt trouwens wel gecontroleerd op bestaan v.d. gebruikersnaam:
Als de uitvoer 0 is dan is er geen gebruikersnaam met die naam.
Bedankt voor je reactie. Leuk dat je er zo over denkt.
Ik ben nog maar een maand of 3 bezig met php.(niet actief af en toe iets.)
Er wordt trouwens wel gecontroleerd op bestaan v.d. gebruikersnaam:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
include_once 'uwx3g.php'; // Connectie met salt page.
$gebruikersnaam = mysql_real_escape_string($_POST['gebruikersnaam']);
$password = md5(salt($_POST['password']));
$mail = mysql_real_escape_string($_POST['mail']);
$datum = date('Y.m.d');
$sql = ('SELECT gebruikersnaam FROM gebruikers WHERE gebruikersnaam=''. $gebruikersnaam . ''');
$uitvoer = mysql_query($sql); //($row = mysql_fetch_assoc($get))
$controle = mysql_num_rows($uitvoer);
if($controle == 0)
{
mysql_query('INSERT INTO gebruikers (id, gebruikersnaam, password, mail, datum) VALUES ('','' . $gebruikersnaam . '', '' . $password . '', '' . $mail . '', '' . $datum . '')');
header('Refresh: 4; url=login.php');
exit ('U bent succesvol aangemeld, u kunt nu inloggen.');
}
else
{
header('Refresh: 2; url=registreren.php');
exit ('Verkeerde gebruikersnaam of wachtwoord.'); // Negatieve melding van ingevoerde gegevens.
}
$gebruikersnaam = mysql_real_escape_string($_POST['gebruikersnaam']);
$password = md5(salt($_POST['password']));
$mail = mysql_real_escape_string($_POST['mail']);
$datum = date('Y.m.d');
$sql = ('SELECT gebruikersnaam FROM gebruikers WHERE gebruikersnaam=''. $gebruikersnaam . ''');
$uitvoer = mysql_query($sql); //($row = mysql_fetch_assoc($get))
$controle = mysql_num_rows($uitvoer);
if($controle == 0)
{
mysql_query('INSERT INTO gebruikers (id, gebruikersnaam, password, mail, datum) VALUES ('','' . $gebruikersnaam . '', '' . $password . '', '' . $mail . '', '' . $datum . '')');
header('Refresh: 4; url=login.php');
exit ('U bent succesvol aangemeld, u kunt nu inloggen.');
}
else
{
header('Refresh: 2; url=registreren.php');
exit ('Verkeerde gebruikersnaam of wachtwoord.'); // Negatieve melding van ingevoerde gegevens.
}
Als de uitvoer 0 is dan is er geen gebruikersnaam met die naam.
@ Orcirna:
Oke oke, dan had ik daar even overheen gekeken ;).
Nee ook niet in een functie, ik bedoel dat je anders zou kunnen afhandelen zodat je niet steeds verder hoeft in te springen...
Voorbeeld
Wat voor voordeel dit heeft, nou stel je krijgt meer input velden bij je formulier, dan zou je op jou manier op een gegeven moment 10 tabs hebben. Bij mij niet, want het word netjes onder elkaar opgevraagd en dan uitgelezen met een foreach loop.
Zoals bij je registratie, dan moet je persoonsgegevens hebben. Stel je wilt meer dan alleen een naam, gebruikersnaam en een wachtwoord dan moet je al behoorlijk wat inspringen. Niet netjes dus.
Oke oke, dan had ik daar even overheen gekeken ;).
Nee ook niet in een functie, ik bedoel dat je anders zou kunnen afhandelen zodat je niet steeds verder hoeft in te springen...
Voorbeeld
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
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
<?php
# Error array zetten
$errors = array();
# Gebruikersnaam niet ingevuld
if( !isset( $_POST['username'] ) )
{
$errors[] = 'Er is geen gebruikersnaam ingevuld.';
}
# Wachtwoord niet ingevuld
if( !isset( $_POST['password'] ) )
{
$errors[] = 'Er is geen wachtwoord ingevuld.';
}
# Geen errors
if( count( $errors ) > 0 )
{
# Query 1,
$sql =
'
SELECT
username,
password
FROM
user
WHERE
username = ''.mysql_real_escape_string( $_POST['username'] ).''
AND
password = ''.mysql_real_escape_string( sha1( $_POST['password'] ) ).''
';
# Query 1 uitvoeren
if( $res = mysql_query( $sql ) )
{
# Resultaten hoger dan nul
if( mysql_num_rows( $res ) > 0 )
{
# Ingelogd dus:
# Sessies aanmaken
# Doorsturen
}
else
{
echo 'Deze gebruiker bestaat niet.';
}
}
else
{
echo 'Er is een fout in de query opgetreden.';
}
}
else
{
# Errors weergeven
foreach( $errors as $error )
{
echo $error.'<br />';
}
}
?>
# Error array zetten
$errors = array();
# Gebruikersnaam niet ingevuld
if( !isset( $_POST['username'] ) )
{
$errors[] = 'Er is geen gebruikersnaam ingevuld.';
}
# Wachtwoord niet ingevuld
if( !isset( $_POST['password'] ) )
{
$errors[] = 'Er is geen wachtwoord ingevuld.';
}
# Geen errors
if( count( $errors ) > 0 )
{
# Query 1,
$sql =
'
SELECT
username,
password
FROM
user
WHERE
username = ''.mysql_real_escape_string( $_POST['username'] ).''
AND
password = ''.mysql_real_escape_string( sha1( $_POST['password'] ) ).''
';
# Query 1 uitvoeren
if( $res = mysql_query( $sql ) )
{
# Resultaten hoger dan nul
if( mysql_num_rows( $res ) > 0 )
{
# Ingelogd dus:
# Sessies aanmaken
# Doorsturen
}
else
{
echo 'Deze gebruiker bestaat niet.';
}
}
else
{
echo 'Er is een fout in de query opgetreden.';
}
}
else
{
# Errors weergeven
foreach( $errors as $error )
{
echo $error.'<br />';
}
}
?>
Wat voor voordeel dit heeft, nou stel je krijgt meer input velden bij je formulier, dan zou je op jou manier op een gegeven moment 10 tabs hebben. Bij mij niet, want het word netjes onder elkaar opgevraagd en dan uitgelezen met een foreach loop.
Zoals bij je registratie, dan moet je persoonsgegevens hebben. Stel je wilt meer dan alleen een naam, gebruikersnaam en een wachtwoord dan moet je al behoorlijk wat inspringen. Niet netjes dus.
Ja dat doe je inderdaad, maar vind je het niet veel netter om een gebruiker gewoon duidelijk aan te kunnen geven wat er fout zit? Gegevens kloppen niet, kan best lastig zoeken zijn als je veel gegevens wilt weten.
BTW: De code tags op dit deel van phphulp kloppen niet, er horen op de binnenste single quotes hun plek eigenlijk double quotes te staan.
BTW: De code tags op dit deel van phphulp kloppen niet, er horen op de binnenste single quotes hun plek eigenlijk double quotes te staan.
ik krijg deze fout melding
kan iemand mij zegge wat ik fout heb gedaan?
ik heb trouwens alleen
login.php
loginv.php
uwx3g.php
registreer gedeelte had ik zelf al gemaakt
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /public/sites/www.snuffelhoekjes.nl/loginv.php on line 16
Warning: Cannot modify header information - headers already sent by (output started at /public/sites/www.snuffelhoekjes.nl/uwx3g.php:33) in /public/sites/www.snuffelhoekjes.nl/loginv.php on line 23
Verkeerde gebruikersnaam of wachtwoord.
kan iemand mij zegge wat ik fout heb gedaan?
ik heb trouwens alleen
login.php
loginv.php
uwx3g.php
registreer gedeelte had ik zelf al gemaakt
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /public/sites/www.snuffelhoekjes.nl/loginv.php on line 16
Warning: Cannot modify header information - headers already sent by (output started at /public/sites/www.snuffelhoekjes.nl/uwx3g.php:33) in /public/sites/www.snuffelhoekjes.nl/loginv.php on line 23
Verkeerde gebruikersnaam of wachtwoord.
Vul ' in bij beide velden dan krijg je dit:
Warning: Division by zero in /public/sites/www.snuffelhoekjes.nl/uwx3g.php on line 17
Warning: chunk_split() [function.chunk-split]: Chunk length should be greater than zero in /public/sites/www.snuffelhoekjes.nl/uwx3g.php on line 19
Warning: Cannot modify header information - headers already sent by (output started at /public/sites/www.snuffelhoekjes.nl/uwx3g.php:33) in /public/sites/www.snuffelhoekjes.nl/loginv.php on line 23
Verkeerde gebruikersnaam of wachtwoord.
Warning: Division by zero in /public/sites/www.snuffelhoekjes.nl/uwx3g.php on line 17
Warning: chunk_split() [function.chunk-split]: Chunk length should be greater than zero in /public/sites/www.snuffelhoekjes.nl/uwx3g.php on line 19
Warning: Cannot modify header information - headers already sent by (output started at /public/sites/www.snuffelhoekjes.nl/uwx3g.php:33) in /public/sites/www.snuffelhoekjes.nl/loginv.php on line 23
Verkeerde gebruikersnaam of wachtwoord.
vul in beide input velden hier http://www.snuffelhoekjes.nl/login.php
Een quote in en dan krijg je die melding
Een quote in en dan krijg je die melding
Met even op internet zoeken vond ik dit (Ziet er een beetje omslachtig uit, dus ik weet niet of het goed is!):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$mysql = mysql_connect('localhost', 'hallo', 'test');
$db = mysql_select_db('hallotest');
if(!$mysql) {
echo 'Er ging iets mis met database connectie';
}
else
{
echo 'Alles ging goed';
}
if(!$db) {
echo 'Er ging iets mis met database connectie';
}
else
{
echo 'Alles ging goed';
}
?>
$mysql = mysql_connect('localhost', 'hallo', 'test');
$db = mysql_select_db('hallotest');
if(!$mysql) {
echo 'Er ging iets mis met database connectie';
}
else
{
echo 'Alles ging goed';
}
if(!$db) {
echo 'Er ging iets mis met database connectie';
}
else
{
echo 'Alles ging goed';
}
?>
Ik snap als beginner helemaal niets van de uwx3g.php, zou daar misschien commentaar bij geplaatst kunnen worden?
Sorry voor het lastig zijn, ik probeer het salten onder de knie te krijgen xD
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
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
<?php
function salt($pass, $salt='7dy23kl6yw4bd9x0k3', $str='')
{//Ik begrijp dat hier een functie aangemaakt wordt om te salten;
$pass = str_replace(' ', '', $pass);
$pass = strrev($pass);// Hij keert hier de functie om, waarom?
$arr[0] = strlen($pass);
$arr[1] = strlen($salt);
while($arr[0] > $arr[1] + 1)
{
$salt = $salt.$salt;
$arr[1] = strlen($salt);
}//Zolang het paswoord meer tekens bevat dan de salt+1 wordt de salt langer gemaakt. (waarom?)
$split_len = floor(max($arr) / (min($arr) - 1)); //hoogst v/d array - (kleinste v/d array -1), de salt wordt eerder al groter of gelijk gemaakt (aant. tekens), dit wordt dus iets boven 1.
$salt = explode(' ', chunk_split($salt, $split_len, ' ')); // salt wordt opgedeelt in stukjes ter grootte van $split_len
array_pop($salt); // haalt de array op van salt, maar die is er toch niet?
$salt = array_reverse($salt);
$j = $arr[0] > count($salt) ? $arr[0] : count($salt);
for($i=0; $i<$j; $i++)
{
if(isset($pass{$i})) $str .= $pass{$i};
if(isset($salt[$i])) $str .= $salt[$i];
}
return $str;
}
?>
function salt($pass, $salt='7dy23kl6yw4bd9x0k3', $str='')
{//Ik begrijp dat hier een functie aangemaakt wordt om te salten;
$pass = str_replace(' ', '', $pass);
$pass = strrev($pass);// Hij keert hier de functie om, waarom?
$arr[0] = strlen($pass);
$arr[1] = strlen($salt);
while($arr[0] > $arr[1] + 1)
{
$salt = $salt.$salt;
$arr[1] = strlen($salt);
}//Zolang het paswoord meer tekens bevat dan de salt+1 wordt de salt langer gemaakt. (waarom?)
$split_len = floor(max($arr) / (min($arr) - 1)); //hoogst v/d array - (kleinste v/d array -1), de salt wordt eerder al groter of gelijk gemaakt (aant. tekens), dit wordt dus iets boven 1.
$salt = explode(' ', chunk_split($salt, $split_len, ' ')); // salt wordt opgedeelt in stukjes ter grootte van $split_len
array_pop($salt); // haalt de array op van salt, maar die is er toch niet?
$salt = array_reverse($salt);
$j = $arr[0] > count($salt) ? $arr[0] : count($salt);
for($i=0; $i<$j; $i++)
{
if(isset($pass{$i})) $str .= $pass{$i};
if(isset($salt[$i])) $str .= $salt[$i];
}
return $str;
}
?>
Sorry voor het lastig zijn, ik probeer het salten onder de knie te krijgen xD
Ik probeer dit script aan de praat te krijgen maar dan krijg ik de volgende error:
'Fatal error: Call to undefined function now() in ....\htdocs\.....\registreerv.php on line 31'.
Heeft iemand een idee waar dit aan zou kunnen liggen?
In de database het ik het veld datum in de gebruikerstabel DateTime gekozen en 0000-00-00 00:00:00.
Heb ik overigens iets gemist maar ik heb zelf de tabel aangemaakt of staat er ergens een voorbeeld?
'Fatal error: Call to undefined function now() in ....\htdocs\.....\registreerv.php on line 31'.
Heeft iemand een idee waar dit aan zou kunnen liggen?
In de database het ik het veld datum in de gebruikerstabel DateTime gekozen en 0000-00-00 00:00:00.
Heb ik overigens iets gemist maar ik heb zelf de tabel aangemaakt of staat er ergens een voorbeeld?
Ik probeer dit script aan de praat te krijgen maar dan krijg ik de volgende error:
'Fatal error: Call to undefined function now() in ....\htdocs\.....\registreerv.php on line 31'.
Heeft iemand een idee waar dit aan zou kunnen liggen?
In de database het ik het veld datum in de gebruikerstabel DateTime gekozen en 0000-00-00 00:00:00.
Heb ik overigens iets gemist maar ik heb zelf de tabel aangemaakt of staat er ergens een voorbeeld?
'Fatal error: Call to undefined function now() in ....\htdocs\.....\registreerv.php on line 31'.
Heeft iemand een idee waar dit aan zou kunnen liggen?
In de database het ik het veld datum in de gebruikerstabel DateTime gekozen en 0000-00-00 00:00:00.
Heb ik overigens iets gemist maar ik heb zelf de tabel aangemaakt of staat er ergens een voorbeeld?
Ik begrijp inmiddels dat now() een mysql functie is maar deze staat als php code opgenomen bij registreren. Maar goed waarom het ik er dan problemen mee en anderen niet. Ik heb de regel ook aangepast:
password, mail, datum) VALUES ('','' . $gebruikersnaam . '', '' . $password . '', '' . $mail . '', 'now()')')
Maar helaas nog geen succes.
password, mail, datum) VALUES ('','' . $gebruikersnaam . '', '' . $password . '', '' . $mail . '', 'now()')')
Maar helaas nog geen succes.
Ik het aangepast zoals door gerhard aangegeven:
Maar nu krijg ik de volgende warning:
Ik begrijp waar deze error vandaan komt althans dat denk ik: header ('Refresh....
Maar hoe los ik het nu op!!!!?????
En in werkelijkheid is er geen record in de database aangemaakt!
Maar wat ik nu zo vreemd vindt is dat veel mensen lovend zijn over dit script, en dat geloof ik onmiddellijk, maar dat het niet werkt.... bij mij
Code (php)
1
2
3
4
2
3
4
mysql_query('INSERT INTO gebruikers (id, gebruikersnaam, password, mail, datum) VALUES ('','' . $gebruikersnaam . '', '' . $password . '', '' . $mail . '', now())'); // Gebruiker in db plaatsen.
<b>header('Refresh: 4; url=login.php');</b>
exit ('U bent succesvol aangemeld, u kunt nu inloggen.');
<b>header('Refresh: 4; url=login.php');</b>
exit ('U bent succesvol aangemeld, u kunt nu inloggen.');
Maar nu krijg ik de volgende warning:
Code (php)
1
2
2
Warning: Cannot modify header information - headers already sent by (output started at F:\htdocs\wsvvolleybal\wsv\login\connect.php:8) in F:\htdocs\wsvvolleybal\wsv\login\registreerv.php on line 32
U bent succesvol aangemeld, u kunt nu inloggen.
U bent succesvol aangemeld, u kunt nu inloggen.
Ik begrijp waar deze error vandaan komt althans dat denk ik: header ('Refresh....
Maar hoe los ik het nu op!!!!?????
En in werkelijkheid is er geen record in de database aangemaakt!
Maar wat ik nu zo vreemd vindt is dat veel mensen lovend zijn over dit script, en dat geloof ik onmiddellijk, maar dat het niet werkt.... bij mij
Ok, ik ben weer verder nl:
er stond bij connect.php aan het eind nog een spatie:
dus ?>*
Vervolgens ook nog bij login.php en bij uwx3g.php stond een spatie na de laatste php afsluiting!
* stelt een spatie voor
Maar nu krijg ik wel netjes de melding 'U bent succesvol aangemeld, u kunt nu inloggen' maar in werkelijkheid is er in de gebruikerstabel geen record aangemaakt!
er stond bij connect.php aan het eind nog een spatie:
dus ?>*
Vervolgens ook nog bij login.php en bij uwx3g.php stond een spatie na de laatste php afsluiting!
* stelt een spatie voor
Maar nu krijg ik wel netjes de melding 'U bent succesvol aangemeld, u kunt nu inloggen' maar in werkelijkheid is er in de gebruikerstabel geen record aangemaakt!
Oke, ik ben eruit. Stom maar goed ik leg maar even nog uit. Ik had een bestaande dB waar ik tot op heden eingelijk alleen maar data presenteerde. Het invoeren gaat via een csv vanuit Excel. Nu wil ik dit 'automatiseren' maar de rechten van de database gebruiker voor de database connectie stond alleen op 'SELECT'.... Sorry, maar bedankt voor de geboden hulp.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Ocirina Ocirina- 2 jaar geleden
- 7.621 x bekeken
- Labels
php, mysql, login, injections, sql, ocirina, beveiligd, goed, leuk, programeren
- PHP scripts opties
- PHP algemeen
- Nieuwste PHP scripts
- PHP script toevoegen


PHP hulp
0 seconden vanaf nu