aanmeld script voor inlog systeem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Pieter Jansen

Pieter Jansen

07/08/2008 04:17:00
Quote Anchor link
Beste mensen,

Bij deze zou ik graag enkele feedback ontvangen over dit script.
Het is grotendeels door mijzelf ( her en der wat proberen) samengevoegd en het werkt naar behoren. (althans, voor zover). Kan hier iets mis mee gaan of zou ik nog wat moeten toevoegen qua beveiliging?

met beveiliging bedoel ik bijvoorbeeld catchpa of iets in die richting. Ik vind het zelf namelijk niet echt nodig. Het doel is eigenlijk om mensen die ik ken een eigen webblog te kunnen laten bijhouden (meer als een soort test omgeving voor mij zelf) dan dat het ook daadwerkelijk nut heeft. (daargelaten dat het nut heeft om te weten dat het een goede script is voor het aanmelden.)

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php    
        // als men zich wil registreren
    if ($_GET['actie'] == 'registreren')
        {

    // als formulier reeds is verstuurd         
            if ($_GET['versturen'] == 'ja')
            {

                //als er geen naam is ingevuld
                if (empty($_POST['naam']))             
                {

                    echo "Je hebt geen naam ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
                }

            
    //als er geen wachtwoord is ingevuld    
                else if (empty($_POST['wachtwoord']))
                        {

                            echo "Je hebt geen wachtwoord ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
                        }

        
    //als je geen 2e keer een wachtwoord hebt ingevuld    
                else if (empty($_POST['wachtwoord_controle']))
                        {

                            echo "Je moet ter controle ook het controleveld voor het wachtwoord invullen,
                            <a href=\""
.$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
                        }

    //vergelijk wachtwoord input 1 met wachtwoord input 2
            else {
        // als de wachtwoorden niet overeen komen
                if ($_POST['wachtwoord'] != $_POST['wachtwoord_controle'])
                    {

                        echo "De ingevoerde wachtwoorden kwamen niet overeen,
                        <a href=\""
.$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
                    }

    // als alles klopt, schrijf de data weg in de database
            else     {
                $registreer = "INSERT INTO gebruiker (naam, wachtwoord) VALUES ('".$_POST['naam']."', '".$_POST['wachtwoord']."')";
                    mysql_query($registreer);
                    
                    echo "Uw gegevens zijn succesvol opgeslagen! Klik
                    <a href=\"login.php\">hier</a> om in te kunnen loggen."
;
                    }
        }    
        }

else {

        }
        }

// als formulier nog niet is verstuurd, toon registratieformulier
echo "

        <div id=\"login\">
          <h1>Registreren</h1>
        <p>vul hieronder je gewenste gebruikersnaam en wachtwoord in.</p>
        
        <form action=\""
.$_SERVER['PHP_SELF']."?actie=registreren&versturen=ja\" method=\"post\">
            <label>
            <table width=\"200\" border=\"0\">
                  <tr>
                        <td><p>Gebruikersnaam:</p></td>
                        <td><input type=\"text\" name=\"naam\" size=\"15\"></td>
                  </tr>
                  <tr>
                        <td><p>Wachtwoord:</p></td>
                        <td><input type=\"password\" name=\"wachtwoord\" size=\"15\"></td>
                  </tr>
                   <tr>
                        <td><p>Wachtwoord ter controle:</p></td>
                        <td><input type=\"password\" name=\"wachtwoord_controle\" size=\"15\"></td>
                  </tr>
            </table>
            </label>
          <input type='submit' name='submit' value='Registreer' />
        </form>
</div>
"
;
?>


alle input is uiteraard welkom! Alle extra feedback waar ik (in mijn ogen wat mee kan) zal ik gebruiken ter verbetering. Overigens heb ik ook een inlogsysteem, beveiliging welke alleen samen werkt met het inlog script.

Bij het inlog script maak ik gebruik van $_SESSION oftewel, de data komt in de sessies te staan. ( ik weet niet of dat nog relevant is verder? )
 
PHP hulp

PHP hulp

11/01/2025 21:58:53
 
Jacco Engel

Jacco Engel

07/08/2008 09:15:00
Quote Anchor link
Waarom echo je al je HTML?

verder zou ik niet voor die get variabelen gaan. Daar kun je beter 2 hidden disabled fields voor posten

dus
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="hidden" disabled="disabled" enz.... />


Verder zal ik me nooit op jou site registreren nu ik weet dat je geen wachtwoord encoding gebruikt, zie bijvoorbeeld http://nl3.php.net/md5

Verder is je indenting niet heel duidelijk. ik zou proberen om je code zo te laten inspringen dat direct duidelijk is welke { bij welke } hoort. Dan heb je namelijk ook meteen duidelijk of alles wat word geopend ook weer word gesloten.

Dan is er nog het feit dat je niet controleerd of je query goed gaat. Dit terwijl je na het uitvoeren wel gewoon direct de melding
Quote:
Uw gegevens zijn succesvol opgeslagen!
geeft terwijl dit niet per definitie waar hoeft te zijn.

Dit kun je bijv doen met :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if(mysql_query(/*je query*/) && mysql_affected_rows() == 1)
{

/*is gelukt*/
}
else
{
/* debugstatement */
echo "er is een fout opgetreden op regel ".__LINE__.":<br />".mysql_error();
}

?>


Verder kun je nog overwegen om een if om je formulier heen te doen met

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(!$_SERVER["REQUEST_METHOD"] == "POST" && $error == fasle)
{

/*dan kun je hier je formulier weergeven*/
}
?>


Dan kun je vervolgens van een verkorte if gebruik maken om eventueel al ingevulde velden weer in te vullen.

Verkorte if :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="naam" value="<?php echo (isset($_POST["naam"])?$_POST["naam"] : "" ) ?>"


je defineerd bovenaan je regel :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$error
= false;
?>


vervolgens vervang je al je if else met het volgende :

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
<?php
 if (empty($_POST['naam']))            
                {

                    echo "Je hebt geen naam ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.<br />";
$error = true ;
                }

            
    //als er geen wachtwoord is ingevuld    
                if (empty($_POST['wachtwoord']))
                        {

                            echo "Je hebt geen wachtwoord ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.<br />";
$error = true ;
                        }

?>


Vervolgens zet je je query binnen de volgende if :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if($_SERVER["REQUEST_METHOD"] == "POST" && $error == false)
{

/*je query uitvoeren*/
}
?>


Dit heeft als voordeel dat je meteen alle foutmeldignen krijgt als je iets neit goed invult. Want in deze setup krijg je alleen de eerste fout als je het eerste veld fout invult terwijl de 5de en 6de ook best fout kunnen zijn

Dit komt ook (met name als je grotere formulieren gaat maken) de gebruiksvriendeliujkheid ten goede omdat dan de waarden die wel kloppen gewoon worden weer gegeven.

Okey da wast voor nu

Edit:

voor de leesbaarheid even waar nodig phptags gezet


PS: Was op gegeven moment de draad kwijt dus als het wazig overkomt kan dat kloppen :P
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
 
PHP erik

PHP erik

07/08/2008 09:37:00
Quote Anchor link
Quote:
verder zou ik niet voor die get variabelen gaan. Daar kun je beter 2 hidden disabled fields voor posten
Waarom?

Quote:
Verder zal ik me nooit op jou site registreren nu ik weet dat je geen wachtwoord encoding gebruikt, zie http://nl3.php.net/md5
Je hebt een punt, maar md5 is nou niet echt de oplossing.

@Merijn
Voer je code eens uit met error_reporting(E_ALL) en ini_set('display-errors', 1) bovenaan je pagina. Dan krijg je een waslijst met Notices. Je moet meer controles uitvoeren met isset().

Stel je zegt:
if ($_GET['xxx'] == 'yyy')
Als $_GET['xxx'] dan überhaupt niet bestaat gooit PHP een Notice (undefined index xxx, etc). Dit omdat je eerst moet controleren of $_GET['xxx'] echt bestaat, dus: if (isset($_GET['xxx']) && $_GET['xxx'] == 'yyy')


Verder moet je niet direct je $_POST-waardes in je query gooien. Google maar eens naar SQL injection. Zo kan je hele systeem gehackt worden als magic_quotes_gpc op je server uitstaat. Op de meeste servers staat dit (helaas voor goede programmeurs) wel aan, maar op goede servers staat het uit. En dan kan iedereen heel simpel je hele systeem mogelijk hacken en sowieso allerlei query's uitvoeren op je database.

Oplossing is om je $_POST-waardes in je query een functie als mysql_real_escape_string() te zetten. Zie ook php.net.
 
Jacco Engel

Jacco Engel

07/08/2008 09:48:00
Quote Anchor link
PHPerik schreef op 07.08.2008 09:37:
Quote:
verder zou ik niet voor die get variabelen gaan. Daar kun je beter 2 hidden disabled fields voor posten
Waarom?


Persoonlijke voorkeur om eerlijk te zijn. Ik hou mn URL het liefst zo schoon mogelijk

PHPerik schreef op 07.08.2008 09:37:
Je hebt een punt, maar md5 is nou niet echt de oplossing.


Heb even een subtiele wijziging aangebracht. Verder is md5 nog altijd beter dan niets
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
 
Douwe

Douwe

07/08/2008 10:14:00
Quote Anchor link
En om maar even iets toe te voegen:
Je kunt beter trim($_POST['var']) == "" gebruiken dan empty($_POST['var'])
empty() ziet '0' namelijk ook als leeg, terwijl bij sommige vragen 0 een goed antwoord is.
 
Pieter Jansen

Pieter Jansen

07/08/2008 16:02:00
Quote Anchor link
Bedankt allemaal voor de reacties! Hier kan ik inderdaad veel mee. Ik heb de code er nu bij open staan en het klopt, ik heb ook zitten te denken aan md5 maar goed.

Ook zat ik eventueel te denken aan een javascript oplossing om iets versleuteld weg te schrijven naar de database.

En @Jacoo: Het komt inderdaad een beetje wazig over, maar toch wil ik je enorm bedanken. Ik kom er wel uit hoor.

@PHPerik: wat zou ik moeten doen om SQL injection te voorkomen? de magic quotes_gpc aanzetten, of toch mysql_real_escape_string() gebruiken?

@Douwe M: Bedankt. Ik denk dat ik het ook ga toepassen. Maar het zou niet echt nodig hoeven zijn denk ik.

In ieder geval al bedankt voor de reacties. Ik ga er nog even verder mee puzzelen.
 
Jacco Engel

Jacco Engel

07/08/2008 16:04:00
Quote Anchor link
Quote:
Ook zat ik eventueel te denken aan een javascript oplossing om iets versleuteld weg te schrijven naar de database


Nee dat doe je niet want javascript is clientside en kan uit :)
 
Pieter Jansen

Pieter Jansen

07/08/2008 16:07:00
Quote Anchor link
Ja klopt, daarom heb ik het ook nog niet. Maar het is wel een optie als dubbele check. Maar de versleuteling door javascript is inderdaad geen goed idee.

Een eerste check door javascript kan op zich alleen geen kwaad. Je hoeft namelijk niet meteen een nieuwe pagina te laden en je hoeft je server ook niet nog een keer aan te spreken.

Overigens is dit ook slechts een script welke eigenlijk nog uit gebreid moet worden mbt. gegevens. Maar daar kom ik later misschien nog even op terug.
 
Pieter Jansen

Pieter Jansen

07/08/2008 17:33:00
Quote Anchor link
Beste medemensen,

Bij deze de verbeterde versie! Echter weet ik niet zeker of ik alles juist toe pas. Ik ben namelijk nog een nieuweling betreffende PHP. Wederom is alle feedback welkom!

ps. @Jacco: Je hulp is uiteraard welkom maar ik zou niet weten hoe ik mijn hele script zou moeten omzetten met de voorgestelde opties. Bij mij gaat het vaak wat omslachtig. Toch bedankt.


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
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
<?php    

    //errror reporting    
    error_reporting(E_ALL);
    ini_set('display-errors', 1);
    
        // als men zich wil registreren (nu met isset)
    if (isset($_GET['actie']) && $_GET['actie'] == 'registreren')
        {

    // als formulier reeds is verstuurd (nu ook met isset)    
            if (isset($_GET['versturen']) && $_GET['versturen'] == 'ja')
                {

                
                //ipv.  empty gebruik ik de functie trim om zo zeker te weten dat deze leeg is.
                if (trim(($_POST['naam'] == "")))    
        {

            echo "Je hebt geen naam ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }

        
        
    else if (trim(($_POST['wachtwoord'] == "")))
        {

            echo "Je hebt geen wachtwoord ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }

        
        
    else (if trim(($_POST['wachtwoord_controle'] == "")))
        {

            echo "Je moet ter controle ook het controleveld voor het wachtwoord invullen,
            <a href=\""
.$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }

        
    else {
        if ($_POST['wachtwoord'] != $_POST['wachtwoord_controle'])
        {

            echo "De ingevoerde wachtwoorden kwamen niet overeen,
            <a href=\""
.$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }


    else     {
        // gebruik real escape string om SQL injection tegen te gaan.
        $naam = mysql_real_escape_string($_POST['naam']);
        $wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
            
            //encryp het wachtwoord met MD5
            $salt  = 'Rg#1j.(7yHg]@gU';
            $hash = md5($salt.$_POST['wachtwoord']);
        // schrijf het weg in de database!! (weet ik alleen niet zeker of ik hier $wchtwoord moet gebruiken of $hash )
        $registreer = "INSERT INTO gebruiker (naam, wachtwoord) VALUES ('".$naam."', '".$wachtwoord."')";
            mysql_query($registreer);
            
            if(mysql_query($registreer) && mysql_affected_rows() == 1)
                {

                echo "Uw gegevens zijn succesvol opgeslagen! Klik
                <a href=\"login.php\">hier</a> om in te kunnen loggen."
;
                }

                
                else
                    {
                    /* debugstatement */
                    echo "er is een fout opgetreden bij het aanmaken van je account op regel ".__LINE__.".<br />".mysql_error();
                    }
            }
        }    
        }

else {
        }
        }

// als formulier nog niet is verstuurd, toon registratieformulier
echo "

        <div id=\"login\">
          <h1>Registreren</h1>
        <p>vul hieronder je gewenste gebruikersnaam en wachtwoord in.</p>
        
        <form action=\""
.$_SERVER['PHP_SELF']."?actie=registreren&versturen=ja\" method=\"post\">
            <label>
            <table width=\"200\" border=\"0\">
                  <tr>
                        <td><p>Gebruikersnaam:</p></td>
                        <td><input type=\"text\" name=\"naam\" size=\"15\"></td>
                  </tr>
                  <tr>
                        <td><p>Wachtwoord:</p></td>
                        <td><input type=\"password\" name=\"wachtwoord\" size=\"15\"></td>
                  </tr>
                   <tr>
                        <td><p>Wachtwoord ter controle:</p></td>
                        <td><input type=\"password\" name=\"wachtwoord_controle\" size=\"15\"></td>
                  </tr>
            </table>
            </label>
          <input type='submit' name='submit' value='Registreer' />
        </form>
</div>
"
;
?>
Gewijzigd op 01/01/1970 01:00:00 door Pieter Jansen
 
Jacco Engel

Jacco Engel

07/08/2008 18:14:00
Quote Anchor link
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
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
<?php    

    //errror reporting    
    error_reporting(E_ALL);
    ini_set('display-errors', 1);
    
    $error = false
        // als men zich wil registreren (nu met isset)
    if (isset($_GET['actie']) && $_GET['actie'] == 'registreren')
        {

    // als formulier reeds is verstuurd (nu ook met isset)    
     if (isset($_GET['versturen']) && $_GET['versturen'] == 'ja')
                {

                
                //ipv.  empty gebruik ik de functie trim om zo zeker te weten dat deze leeg is.
                if (trim(($_POST['naam'] == "")))    
        {

            $error = true ;
            echo "Je hebt geen naam ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }

        
        
    if (trim(($_POST['wachtwoord'] == "")))
        {

            $error = true ;
            echo "Je hebt geen wachtwoord ingevuld, <a href=\"".$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }

        
        
    if (trim($_POST['wachtwoord_controle']) == "")
        {

            $error = true ;
            echo "Je moet ter controle ook het controleveld voor het wachtwoord invullen,
            <a href=\""
.$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }

        
    
        if ($_POST['wachtwoord'] != $_POST['wachtwoord_controle'] && $error == false)
        {

            echo "De ingevoerde wachtwoorden kwamen niet overeen,
            <a href=\""
.$_SERVER['PHP_SELF']."?actie=registreren\">Probeer nogmaals</a>.";
        }


    if($error == false && $_SERVER["REQUEST_METHOD"] == "POST")
    {

        // gebruik real escape string om SQL injection tegen te gaan.
        $naam = mysql_real_escape_string($_POST['naam']);
        $wachtwoord = mysql_real_escape_string($_POST['wachtwoord']);
            
            //encryp het wachtwoord met MD5
            $salt  = 'Rg#1j.(7yHg]@gU';
            $hash = md5($salt.$_POST['wachtwoord']);
        // schrijf het weg in de database!! (weet ik alleen niet zeker of ik hier $wchtwoord moet gebruiken of $hash )
        $registreer = "INSERT INTO gebruiker (naam, wachtwoord) VALUES ('".$naam."', '".$wachtwoord."')";
            
            if(mysql_query($registreer) && mysql_affected_rows() == 1)
                {

                echo "Uw gegevens zijn succesvol opgeslagen! Klik
                <a href=\"login.php\">hier</a> om in te kunnen loggen."
;
                }

                
                else
                    {
                    /* debugstatement */
                    echo "er is een fout opgetreden bij het aanmaken van je account op regel ".__LINE__.".<br />".mysql_error();
                    }
            }
        }    
     }

    ?>

        <div id="login">
          <h1>Registreren</h1>
        <p>vul hieronder je gewenste gebruikersnaam en wachtwoord in.</p>
        
        <form action="<?php echo $_SERVER["PHP_SELF"] ?>"?actie=registreren&versturen=ja" method="post">
            <label>
            <table width="200" border="0">
                  <tr>
                        <td><p>Gebruikersnaam:</p></td>
                        <td><input type="text" name="naam" size="15"></td>
                  </tr>
                  <tr>
                        <td><p>Wachtwoord:</p></td>
                        <td><input type="password" name="wachtwoord" size="15"></td>
                  </tr>
                   <tr>
                        <td><p>Wachtwoord ter controle:</p></td>
                        <td><input type="password" name="wachtwoord_controle" size="15"></td>
                  </tr>
            </table>
            </label>
          <input type='submit' name='submit' value='Registreer' />
        </form>
</div>
";
?>


Zo had ik het ongeveer in gedachte :)
 
Pieter Jansen

Pieter Jansen

07/08/2008 18:56:00
Quote Anchor link
Beste Jacco,

Oke dan! ik zal hem er eens tussenvoegen. Kijken of ik ook nog iets moet aanpassen in de CSS. Denk het niet maar zoals hij nu is zou hij moeten werken dan?

Want ik weet niet zeker of dat real escape string werkt en of de hash die ik gebruik bij MD5 ook goed werkt. Moet ik anders de $hash opslaan of gewoon $wachtwoord?
 



Overzicht Reageren

 
 

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.