Toon posts:

Login + Registratie systeem

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Goedendag alle,

Ik ben sinds gister bezig met een login systeem. Dit heb ik gemaakt via de tutorials van Nickfrosty. Maar het wilt nog niet helemaal lekker werken.

Zo heb ik wel één account kunnen aanmaken die kan inloggen en netjes wordt doorgestuurd naar de 'member page'. Maar wanneer ik via (ook zelfgemaakt) een registratie formulier of via de database een tweede account wil toevoegen lukt dit niet. Ik krijg dan de melding 'Wachtwoord verkeerd.' Terwijl ik gewoon het goede intype. Ben al een aantal uur bezig en heb al die tutorials opnieuw doorlopen maar geen opvallende fout(jes) tegen gekomen.

Login script.
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
78
79
80
81
82
83
84
85
86
87
<?php
error_reporting (E_ALL^E_NOTICE);

session_start ();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<?php
    $form = "<form action='./login.php' method='post'>
    <table>
        <tr>
            <td>Username:</td>
            <td><input type='text' name='user'/></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type='password' name='password'/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type='submit' value='inloggen' name='loginbtn'/></td>
        </tr>

    </table>
    </form>";
    
    if ($_POST['loginbtn']){
        $user = $_POST['user'];
        $password = $_POST['password'];
    
    if ($user) {
        if ($password){
                require("connect.php");
                
                $password = md5(md5("jhSawbf".$password."D2e1ef353"));
                // Het controleren van de login functies, zodat je zeker weet dat de gegevens correct zijn.
                $query = mysql_query("SELECT * FROM users WHERE username='$user'");
                $numrows = mysql_num_rows($query);
                if ($numrows == 1){
                    $row = mysql_fetch_assoc($query);
                    $dbid = $row['id'];
                    $dbuser = $row['username'];
                    $dbpass = $row['password'];
                    $dbactive = $row['active'];
                                    
                    if ($password == $dbpass) {
                        if ($dbactive == 1){
                            
                            // Huidige sessie informatie.
                            $_SESSION['userid'] = $dbid;
                            $_SESSION['username'] = $dbuser;
                            
                            echo "Je bent succesvol ingelogd als <b>$dbuser</b> Klik <a href='../loginAccount.php'>hier</a> om door te gaan.";
                            
                            }   
                            else
                                echo "Je moet je account nog activeren!";
                    }
                    else
                        echo "Je hebt het verkeerde wachtwoord opgegeven. $form";
                }
                else
                    echo "De gebruikersnaam is niet gevonden. $form";
                
                mysql_close();
            }
            else
                echo "Je moet een wachtwoord opgeven. $form";
        }
        else
            echo "Geef een login-naam op. $form";
    
    }
    else
        echo $form;

?>
</body>
</html>


Registratie script:
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
error_reporting (E_ALL^E_NOTICE);
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
    
<?php

if ($_POST['registerbtn']) {
    $getuser = $_POST['user'];
    $getemail = $_POST['email'];
    $getpass = $_POST['pass'];
    $getretypepass = $_POST['retypepass'];
    
    if ($getuser) {
        if ($getemail){
            if ($getpass) {
                if ($getretypepass){
                    if ($getpass === $getretypepass) {
                        if ( (strlen($getemail) >= 7) && (strstr($getemail, "@")) && (strstr($getemail, "@")) ) {
                            require("connect.php");
                            
                            $query = mysql_query("SELECT * FROM users WHERE username = '$getuser'");
                            $numrows = mysql_num_rows($query);
                            if ($numrows == 0) {
                                $query = mysql_query("SELECT * FROM users WHERE email = '$getemail'");
                                $numrows = mysql_num_rows($query);
                                if ($numrows == 0) {
                                    
                                    $password = md5(md5("jhSawbf".$password."D2e1ef353"));
                                    $date = date(" F d, Y");
                                    $code = md5(rand());
                                    
                                    mysql_query("INSERT INTO users VALUES (
                                        '', '$getuser', '$password', '$getemail', '0', '$code', '$date'
                                    )"); 
                                    
                                    $query = mysql_query("SELECT *FROM users WHERE username='$getuser'");
                                    $numrows = mysql_num_rows($query);
                                    if ($numrows == 1){
                                            
                                            $site = "http://localhost/website/login";
                                            $webmaster = "Test <mijnemailadres@nl>";
                                            $headers = "From: $webmaster";
                                            $subject = "Account activatie";
                                            $message = "Bedankt voor het registreren klik op de link hieronder om je activatie                                              af te ronden.\n";
                                            $message .= "$site/activate.php?user=$getuser&code=$code\n";
                                            $message .= "Je moet je account activeren om in te kunnen loggen!";
                                        
                                            if (mail($getemail, $subject, $message, $headers)){
                                                $errormsg = "Je bent geregistreerd, je moet je account activeren via de link die                                                gestuurd is naar: <b>$getemail</b>";
                                                $getuser  = "";
                                                $getemail = "";
                                            }
                                            else
                                                $errormsg = "Er is iets fout gegaan, je account is niet geactiveerd!";
                                            
                                        }
                                        else
                                            $errormsg = "Er is iets fout gegaan, je account is niet aangemaakt.";
                                }
                                else
                                    $errormsg = "Er is al een gebruiker met dit e-mail adres!"; 
                                
                                
                            }
                            else
                                $errormsg = "Er is al een gebruiker met deze naam!";
                                
                                
                            mysql_close ();
                        }
                        else
                            $errormsg = "Je moet een geldig e-mail adres opgeven om te kunnen registreren!";
                    }
                    else
                        $errormsg = "Je wachtwoorden komen niet overeen!";
                }
                else
                    $errormsg = "Je moet je wachtwoord twee keer opgeven om te kunnen registreren!";
            }
            else
                $errormsg = "Je moet een wachtwoord opgeven om te kunnen registreren!";
        }
        else
            $errormsg = "Je moet een e-mail adres opgeven om te kunnen registreren!";
    }   
    else
        $errormsg = "Je moet een gebruikersnam opgeven om te kunnen registreren!";  
}
        
    
$form = "<form action='register.php' method='post'>

        <table>
            
            <tr>
            <td><font color='red'>$errormsg</font</td>
            </tr>
            
            <tr>
            <td>Inlognaam:</td>
            <td><input type='text' name='user' value='$getuser' /></td>
            </tr>
            
            <tr>
            <td>E-mail adres:</td>
            <td><input type='text' name='email' value='$getemail' /></td>
            </tr>
            
            <tr>
            <td>Wachtwoord:</td>
            <td><input type='password' name='pass' value='' /></td>
            </tr>
            
            <tr>
            <td>Herhaal wachtwoord:</td>
            <td><input type='password' name='retypepass' value='' /></td>
            </tr>
            
            <td><input type='submit' name='registerbtn' value='Register' /></td>
            
        </table>

        </form>";
        
        echo $form;
        
        
?>

</body>
</html>


Hebben jullie misschien ideeën, of tips in welke richting van de code ik moet kijken?

Bedankt.

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 02-12 13:38
Dat loginscript checkt of de kolom 'active' de waarde 1 heeft (regel 55).
In je registratie-script kan ik niet ontdekken of jij die kolom voor je tweede account die waarde geeft.

Verwijderd

Topicstarter
Deze waarde staat wanneer je registreert op '0'. Er wordt een e-mail verzonden aan het e-mail adres dat je hebt opgegeven bij de registratie. Vervolgens klik je op de link en je account wordt geactiveerd (dit script staat niet in dit topic.). Maar wanneer ik de waarde 'handmatig' verander in de database. Dan krijg ik hetzelfde probleem.

Als dat is wat je bedoelt?

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Waar komt $password ineens vandaan op regel 38 van je registratie script? Ik zou je willen adviseren om ook notices en stricte errors aan te zetten (error_reporting). Deze waarschuwt je als het goed is hiervoor.

De tutorial zit trouwens vol met bad practices. Gebruik het als leidraad om van start te gaan, maar gebruik dit niet als heilige graal :)

[ Voor 86% gewijzigd door Feanathiel op 03-02-2013 12:53 ]


Verwijderd

Topicstarter
Ik maak deze tutorials alleen maar om een beeld te krijgen van PHP. Zo heb ik ook me HTML geleerd namelijk, HTML heb ik nu aardig onder de knie. Vandaar dat nu PHP aan de beurt is .

Verder geeft hij alleen deze error:
[03-Feb-2013 11:17:12 UTC] PHP Notice: Undefined index: loginbtn in C:\xampp\htdocs\website\login\login.php on line 2
Volgens mij heeft deze error niet veel te maken met mij probleem, toch?

Wanneer ik mijn eerst gemaakte account kopieer in de database en hem vervolgens een andere 'username' geef, dan werkt hij wel met het inloggen. Maar dan heeft hij wel hetzelfde wachtwoord en dezelfde (md5) code. Maar wat er mis is met het wachtwoord gedeelte snap ik niet. Nogmaals de tutorials doorlopen?

[ Voor 26% gewijzigd door Verwijderd op 03-02-2013 12:37 ]


  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Excuses. Het ging om het registratiescript. Ik heb dit nu verbeterd in de vorige post. Wat je daar overigens probeert te doen (in het registratiescript) is een hash te maken van het wachtwoord ($password). Lees je hoger in je code, dan zie je daar nooit $password tegen komen, en is je wachtwoord dus leeg. Vermoedelijk kun je nu dus inloggen zonder een wachtwoord op te geven.

Verwijderd

Topicstarter
Wanneer ik juist geen $password invul dan wordt er geen 'password' gerigstreerd in de database. En blijft het juist leeg.

Wanneer ik wel met $password werk dan wordt hij wel degelijk gerigstreerd in de database en wordt er een md5 van gemaakt. Zoals ik dat aan heb gegeven. Gaat daar niks fout? Want de eerste 'md5' code heb ik zelf gemaakt. En hem gewijzigd in de database, dit is juist het account dat wel werkt. De accounts waar hij de code zelf genereert werken niet.

[ Voor 11% gewijzigd door Verwijderd op 03-02-2013 13:06 ]


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Verwijderd schreef op zondag 03 februari 2013 @ 12:34:
Ik maak deze tutorials alleen maar om een beeld te krijgen van PHP. Zo heb ik ook me HTML geleerd namelijk, HTML heb ik nu aardig onder de knie. Vandaar dat nu PHP aan de beurt is .

Verder geeft hij alleen deze error:

[...]


Volgens mij heeft deze error niet veel te maken met mij probleem, toch?

Wanneer ik mijn eerst gemaakte account kopieer in de database en hem vervolgens een andere 'username' geef, dan werkt hij wel met het inloggen. Maar dan heeft hij wel hetzelfde wachtwoord en dezelfde (md5) code. Maar wat er mis is met het wachtwoord gedeelte snap ik niet. Nogmaals de tutorials doorlopen?
isset() gebruiken om die notice te voorkomen.

Overigens, wat denk je dat er gebeurt als ik de gebruikersnaam ' OR 1 = 1 of '; DROP TABLE users; gebruik? ;)

Verwijderd

Topicstarter
Wat zou er moeten gebeuren dan? Op het moment kan er namelijk niet veel gebeuren, want het zit niet echt mee. Is het een idee om de md5 weg te laten? En kijken wat hij dan doet?

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 16:38
Radiant schreef op zondag 03 februari 2013 @ 13:18:
[...]


isset() gebruiken om die notice te voorkomen.

Overigens, wat denk je dat er gebeurt als ik de gebruikersnaam ' OR 1 = 1 of '; DROP TABLE users; gebruik? ;)
Die DROP TABLE zal niet zoveel doen, aangezien mysql_query maar 1 mysql statement uitvoert ;)
Maar je input escapen moet je zeker doen, anders kan je heel de query aanpassen en inloggen met andere gegevens ed.. Beter zoek je een recente tutorial, die gebruikt maakt van PDO met prepared statements, aangezien mysql_* sterk afgeraden wordt.
En md5 gebruiken kan tegenwoordig eigenlijk niet meer, gebruik voor wachtwoorden bcrypt.

Zie bijv. http://www.phptherightway.com/

[ Voor 6% gewijzigd door Barryvdh op 03-02-2013 13:37 ]


Verwijderd

Topicstarter
Dan zal ik op zoek gaan naar wat anders. Jammer, hier ben ik namelijk wel even mee bezig geweest. In ieder geval bedankt voor jullie hulp. _/-\o_

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024

Mei

Wat gebeurt er als je als gebruikersnaam in het formulier het volgende invult?
code:
1
';DELETE FROM users WHERE '' ='


Juist, je hebt nu dus gezien wat SQL injection is en waarom je je apps daartegen moet beveiligen.

[ Voor 8% gewijzigd door Mei op 04-02-2013 16:12 ]


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 16:38
Mei schreef op maandag 04 februari 2013 @ 16:11:
Wat gebeurt er als je als gebruikersnaam in het formulier het volgende invult?
code:
1
';DELETE FROM users WHERE '' ='


Juist, je hebt nu dus gezien wat SQL injection is en waarom je je apps daartegen moet beveiligen.
Barryvdh schreef op zondag 03 februari 2013 @ 13:36:
[...]
Die DROP TABLE zal niet zoveel doen, aangezien mysql_query maar 1 mysql statement uitvoert ;)

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Gebruik alsjeblieft geen mysql_* functies meer, deze zijn ook deprecated vanaf php5.4(?). Kijk eens naar PDO, daarmee voorkom je dingen als SQL-injectie en zit je niet te prutsen met het `preparen` van je data. MD5 is ook outdated, kijk eens naar de crypt functie in php of de mcrypt extensie.

In eerste instantie zal dit niet zo behulpzaam klinken, maar als je bovenstaande gebruikt (en goed toepast) dan wordt je script duidelijker, korter en veiliger. :)

  • widecr0w
  • Registratie: Februari 2011
  • Laatst online: 30-08-2022
Uiteraard zijn bovenstaande suggesties de betere.. maar ik wil toch nog even aanhalen dat:

$password = md5(md5("jhSawbf".$password."D2e1ef353"));

in deze statement het 2e $password misschien deze moet zijn?

$getpass = $_POST['pass'];

*edit: in registratiescript

[ Voor 5% gewijzigd door widecr0w op 05-02-2013 17:15 ]


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 16:38
Aloys schreef op maandag 04 februari 2013 @ 16:48:
Gebruik alsjeblieft geen mysql_* functies meer, deze zijn ook deprecated vanaf php5.4(?). Kijk eens naar PDO, daarmee voorkom je dingen als SQL-injectie en zit je niet te prutsen met het `preparen` van je data.
Sinds PHP 5.5 alpha2 is het officieel deprecated :)
This extension is now deprecated, and deprecation warnings will be generated when connections are established to databases via mysql_connect(), mysql_pconnect(), or through implicit connection: use MySQLi or PDO_MySQL instead (https://wiki.php.net/rfc/mysql_deprecation).

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024

Mei

Ik zou trouwens ook geen user ID en user name in je sessie opslaan. Het beste is een hash te gebruiken, en dan elke page request te kijken welke user er bij de hash in de sessie hoort, en die uit je DB te laden:
1) user ID in je sessie kan makkelijk in een andere ID veranderd worden als de sessie gekaapt wordt
2) user name in je sessie heb je nooit nodig. Gewoon elke request je user object uit de DB halen die de meest up to date user name en andere gegevens bevat.

Probeer je code ook eens in losse functies te verdelen en deze in centrale bestanden op te slaan. Elke functie moet één specifieke taak uitvoeren, en heeft een input en output van vooraf vastgelegde types. Dit maakt het makkelijker bugs te voorkomen, op te lossen en het overzicht te bewaren.

  • joppybt
  • Registratie: December 2002
  • Laatst online: 15:43
Mei schreef op dinsdag 05 februari 2013 @ 17:27:
Ik zou trouwens ook geen user ID en user name in je sessie opslaan. Het beste is een hash te gebruiken, en dan elke page request te kijken welke user er bij de hash in de sessie hoort, en die uit je DB te laden:
1) user ID in je sessie kan makkelijk in een andere ID veranderd worden als de sessie gekaapt wordt
De sessie data wordt serverside opgeslagen. Hoe kan dat in vredesnaam 'gemakkelijk veranderd worden'?

Haal je niet de sessie en cookies door elkaar (in de laatste opslaan zou wel een heel slecht idee zijn)?

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024

Mei

Whoops. Je hebt gelijk :X

  • koendenb
  • Registratie: Januari 2011
  • Laatst online: 29-11 01:24
Het enige wat je moet veranderen in je registratie script is:

PHP:
1
 $password = md5(md5("jhSawbf".$password."D2e1ef353"));


naar:

PHP:
1
 $password = md5(md5("jhSawbf".$getpass."D2e1ef353"));

[ Voor 13% gewijzigd door koendenb op 06-02-2013 12:32 ]


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Waarom tweemaal md5?

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Is twee keer zo veilig, jeweettoch!

https://niels.nu


  • Beatboxx
  • Registratie: April 2010
  • Laatst online: 26-10-2022

Beatboxx

Certified n00b

Je gebruikt nu MD5. MD5 komt in de praktijk neer op plain-text, zolang je wachtwoorden gebruikt die niet al te lang zijn. Er circuleren enorme rainbow-tables op het internet die het wachtwoord zoeken dat bij de hash hoort. Beter kan je scripts zoals Bcrypt gebruiken.

  • joppybt
  • Registratie: December 2002
  • Laatst online: 15:43
Beatboxx schreef op donderdag 07 februari 2013 @ 17:39:
Je gebruikt nu MD5. MD5 komt in de praktijk neer op plain-text, zolang je wachtwoorden gebruikt die niet al te lang zijn. Er circuleren enorme rainbow-tables op het internet die het wachtwoord zoeken dat bij de hash hoort. Beter kan je scripts zoals Bcrypt gebruiken.
Hij doet md5("jhSawbf".$password."D2e1ef353"). Het lijkt me sterk dat er rainbow tabellen circuleren voor deze (pre- and post-) salt.

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 13:00
joppybt schreef op donderdag 07 februari 2013 @ 18:17:
[...]Het lijkt me sterk dat <insert iets>
En zo begint het altijd... ^^

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 16:38
joppybt schreef op donderdag 07 februari 2013 @ 18:17:
[...]

Hij doet md5("jhSawbf".$password."D2e1ef353"). Het lijkt me sterk dat er rainbow tabellen circuleren voor deze (pre- and post-) salt.
En heeft hij die waardes zelf bedacht of van de tutorial gehaald? En zijn ze in het echt anders?
Het is waarschijnlijk wel iets veiliger dan standaard md5, zolang je de code niet ziet, maar ik zie er niet op rekenen. Gewoon bcrypt gebruiken.
Pagina: 1