Beveiligde login, en registratie.

Door Ocirina Ocirina, 11 jaar geleden, 22.583x bekeken

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

  1. uwx3g.php
  2. registreren.php
  3. registreerv.php
  4. loginv.php
  5. login.php
  6. connect.php

 

Er zijn 46 reacties op 'Beveiligde login en registratie'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Joey van der wal
joey van der wal
11 jaar geleden
 
0 +1 -0 -1
Ik als beginnende phper, vind dit er goed uit zien!
Jammer dat er geen voorbeeld online staat?

mvg Joey
Joey van der wal
joey van der wal
11 jaar geleden
 
0 +1 -0 -1
door mijn trage internet had ik 2 keer het zelfde bericht gepost maar kan hem alleen aanpassen niet verwijderen?

BTW. Jammer dat er wijnig commentaar in het script staat.
mvg Joey
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
@Joey
Helaas Joey heb je gelijk.
Maar ik heb het getest en het werkt.
Ik ga nu proberen een voorbeeld online te krijgen!
In ieder geval bedankt voor je reactie.
Joey van der wal
joey van der wal
11 jaar geleden
 
0 +1 -0 -1
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
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
Joey, ik weet hier ook niet echt op te antwoorden.
Ik hoop dat anderen ook zullen reageren zodat ik er ook iets aan heb. Mvg.
Jurrian Nijland
Jurrian Nijland
11 jaar geleden
 
0 +1 -0 -1
1. Ziet er goed uit! Kan ik vast ook wel weer gebruiken =)
2. Zoals al eerder iemand zei, kan er een voorbeeld online komen?
3. Een download link kan altijd handig zijn IPV kopiëren plakken.
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
Helaas kreeg ik een bericht of ik het wel zelf had geschreven. Natuurlijk! (muv de salt)
Milo S
Milo S
11 jaar geleden
 
0 +1 -0 -1
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()
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
@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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
            }    

Als de uitvoer 0 is dan is er geen gebruikersnaam met die naam.
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
Edit:
Ik heb het een en het ander aangepast (comentaar)
Ik heb de Header refresh omgezet naar een functie. Is dit zo correct? (Zie registreerv.php)
Jordi Kroon
Jordi Kroon
11 jaar geleden
 
0 +1 -0 -1
ik zou van die md5 sha1 maken
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
Ik hoor graag een onderbouwend argument.
Jordi Kroon
Jordi Kroon
11 jaar geleden
 
0 +1 -0 -1
@Ocirina md5 is veel makkelijker te hacken als sha1 en er zijn hackers met hele grote databases met allemaal decrypted passwords
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
@jordi
Ik ga het veranderen bedankt.
Chris -
Chris -
11 jaar geleden
 
0 +1 -0 -1
@Jordi: Maak gebruik van een goede Salt en het maakt geen reet meer uit =)
Milo S
Milo S
11 jaar geleden
 
0 +1 -0 -1
@ 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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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 />';    
    }
}

?>


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.
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
Ik begrijp wat je bedoeld.
Maar ik controleer dat toch al in 1 if/else?
mvgr.
Milo S
Milo S
11 jaar geleden
 
0 +1 -0 -1
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.
Ricardo houweling
ricardo houweling
11 jaar geleden
 
0 +1 -0 -1
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.
Jasper hoi
jasper hoi
11 jaar geleden
 
0 +1 -0 -1
er gaat iets fout in je DB op lijn 16, die error is al een output en dus kan hij geen header() meer gebruiken.
Ricardo houweling
ricardo houweling
11 jaar geleden
 
0 +1 -0 -1
nou de eerste fout is er uit was iets verkeerd getypt in mn sql
ma die laatste fou krijg ik er niet uit:S
Jordi Kroon
Jordi Kroon
11 jaar geleden
 
0 +1 -0 -1
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.
Ricardo houweling
ricardo houweling
11 jaar geleden
 
0 +1 -0 -1
hu? hoe bedoel je dat?
Jordi Kroon
Jordi Kroon
11 jaar geleden
 
0 +1 -0 -1
vul in beide input velden hier http://www.snuffelhoekjes.nl/login.php

Een quote in en dan krijg je die melding
Pim -
Pim -
11 jaar geleden
 
0 +1 -0 -1
Het script is dus geschreven voor een foutraportage-stand kleiner dan E_WARNING en is dus niet bruikbaar...
Victor Php
Victor Php
11 jaar geleden
 
0 +1 -0 -1
Ik weet niet hoor, maar mij is altijd vertelt dat je géén or die() moet gebruiken. Nu staat er in connect.php or die(). Moet je dat dan niet veranderen?
Ocirina Ocirina
Ocirina Ocirina
11 jaar geleden
 
0 +1 -0 -1
Ja, maar dit is toch de enige uitweg?
Als er geen connectie is geeft die dat gewoon weer van kon geen verb...
Wat zou ik ipv. Die(); moeten geruiken?
Victor Php
Victor Php
11 jaar geleden
 
0 +1 -0 -1
Met even op internet zoeken vond ik dit (Ziet er een beetje omslachtig uit, dus ik weet niet of het goed is!):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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';
}


?>
Victor Php
Victor Php
11 jaar geleden
 
0 +1 -0 -1
@Wouter

Ja, daar had ik het vandaan (snipplr.com)
Vinnie B
Vinnie B
11 jaar geleden
 
0 +1 -0 -1
Ik krijg na aanmaken loginnaam een foutmelding.
Denk dat het aan de opbouw van SQL-database ligt. Kan iemand aangeven hoe deze moet worden opgebouwd?
(of een query sturen)
Nick Zwaal
Nick Zwaal
11 jaar geleden
 
0 +1 -0 -1
Ik snap als beginner helemaal niets van de uwx3g.php, zou daar misschien commentaar bij geplaatst kunnen worden?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
}

?>


Sorry voor het lastig zijn, ik probeer het salten onder de knie te krijgen xD
Jaap Eijk
jaap Eijk
10 jaar geleden
 
0 +1 -0 -1
Op zich een mooi script met leuke technieken, alleen werkt het niet op mijn xamp en bij mijn provider.
Jammer dat het niet goed getest is.
The Force
The Force
10 jaar geleden
 
0 +1 -0 -1
@Jaap of misschien doe jij wel iets fout. Of gebruik je een PHP versie uit het stenen tijdperk.
Hugo Maes
Hugo Maes
10 jaar geleden
 
0 +1 -0 -1
Wat kan ik hier aan doen:

Warning: Cannot modify header information - headers already sent by (output started at /uwx3g.php:33) in /registreerv.php on line 23
Verkeerde gebruikersnaam of wachtwoord.
Vincent Huisman
Vincent Huisman
10 jaar geleden
 
0 +1 -0 -1
stel je vraag even op het forum, denk ook aan een goede foutafhandeling
Hugo Maes
Hugo Maes
10 jaar geleden
 
0 +1 -0 -1
Het is een fout die door bovenstaand inlogsysteem wordt veroorzaakt, daarom dat ik het hier plaats.
Ik zie nu ook net dat ik al drie keer geregistreerd ben onder dezelfde naam én al vijf keer met hetzelfde mailadres, dat klopt ergens niet. Uitkijken naar een ander inlogsysteem :-)
Rick Donderwinkel
Rick Donderwinkel
10 jaar geleden
 
0 +1 -0 -1
Ziet er netjes uit voor een beginnend phper... Zelf ben ik gewend om via een data class te werken... Maar in princiepe werkt het hetzelfde.

Goed geschreven trouwens
Nkamp Kamp van de
nkamp Kamp van de
10 jaar geleden
 
0 +1 -0 -1
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?
Nkamp Kamp van de
nkamp Kamp van de
10 jaar geleden
 
0 +1 -0 -1
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?
Nkamp Kamp van de
nkamp Kamp van de
10 jaar geleden
 
0 +1 -0 -1
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.
Gerhard l
gerhard l
10 jaar geleden
 
0 +1 -0 -1
now()staat nu tussen haakjes dat hoeft niet, bijv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mysql_query('INSERT into test (date, name) VALUES(now(),''.mysql_real_escape_string($name).''');
Nkamp Kamp van de
nkamp Kamp van de
10 jaar geleden
 
0 +1 -0 -1
Ik het aangepast zoals door gerhard aangegeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.');


Maar nu krijg ik de volgende warning:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.


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
Nkamp Kamp van de
nkamp Kamp van de
10 jaar geleden
 
0 +1 -0 -1
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!
Nkamp Kamp van de
nkamp Kamp van de
10 jaar geleden
 
0 +1 -0 -1
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.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Gerhard l
gerhard l
10 jaar geleden
 
0 +1 -0 -1
graag gedaan, in het vervolg als je veel vragen hebt over oudere topics graag een nieuw topic aanmaken.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. uwx3g.php
  2. registreren.php
  3. registreerv.php
  4. loginv.php
  5. login.php
  6. connect.php

Labels

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.