Register/login script met email bevestiging

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jos Vermassen

Jos Vermassen

02/11/2012 14:58:33
Quote Anchor link
Hallo,

Ik ben opzoek naar een goed login script (php/mysql), waarvoor je je eerst moet registreren. Wanneer men geregistreerd heeft, moet men een email aankrijgen om zijn account te activeren. Heeft er iemand een voorbeeld van zo'n script?

Alvast bedankt

Groeten Jos
 
PHP hulp

PHP hulp

04/05/2024 17:30:47
 
- Ariën  -
Beheerder

- Ariën -

02/11/2012 15:19:09
Quote Anchor link
Zo lastig is het ook weer niet. Je moet het veld geactiveerd na de registratie op 0 zetten. En een tijdelijke activatie-code in de database opslaan. Deze stuur je per mail naar de gebruiker, die de code kan bevestigen, waarna je het geactiveerd veld op 1 zet, de gebruiker kan dan inloggen.
 
Jos Vermassen

Jos Vermassen

02/11/2012 15:57:55
Quote Anchor link
- Aar - op 02/11/2012 15:19:09:
Zo lastig is het ook weer niet. Je moet het veld geactiveerd na de registratie op 0 zetten. En een tijdelijke activatie-code in de database opslaan. Deze stuur je per mail naar de gebruiker, die de code kan bevestigen, waarna je het geactiveerd veld op 1 zet, de gebruiker kan dan inloggen.


Dat snap ik niet zo goed. Ik heb nu een simpel stukje geschreven om te registreren. Wat is de volgende stap dat ik moet doen?
Dit heb ik al:

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
<?php
include"../includes/connection.php";

if($_SERVER['REQUEST_METHOD']=="POST")
{

    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);
    $re_password = mysql_real_escape_string($_POST['re_password']);
    $hashed_password = md5($_POST['password']);
    $email = mysql_real_escape_string($_POST['email']);

    if(empty($username))
    {

        echo"Geef een gebruikersnaam in";
    }

    elseif (empty($password))
    {

        echo"Geef een wachtwoord in";
    }

    elseif ($password !== $re_password) {
        echo"Het wachtwoord komt niet overeen";        
    }

    elseif (empty($email)) {
        echo"vul een geldig emailadres in";
    }

    else
    {
        $query = mysql_query("INSERT INTO gebruikers
                (
                    email,
                    username,
                    password
                )
                VALUES
                (
                    '$email',
                    '$username',
                    '$hashed_password'
                )"
);
                                
        echo"correct!";    
    }
}


?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<form action="" method="post">
    Username: <input type="text" name="username"><br>
    Email: <input type="text" name="email"><br>
    Password: <input type="password" name="password"><br>
    Re-type Password: <input type="password" name="re_password"><br>
    <input type="submit">
</form>
Gewijzigd op 02/11/2012 16:00:35 door Jos Vermassen
 
- Ariën  -
Beheerder

- Ariën -

02/11/2012 16:05:50
Quote Anchor link
Twee velden in de database aanmaken in de data met de namen
- activation_code (varchar 32)
- activated (ENUM '0','1')

Zodra iemand geregistreerd is geef je het veld activated de waarde 0 mee (kan je ook als standaardwaarde gebruiken), en maak je met een mt_srand() een unieke code aan, welke je in activation_code opslaat. Bij voorkeur kan je deze door md5() heenhalen om hem tot 32 tekens te brengen.

Als ik nog een paar tips mag geven:
- Lijn 6 t/m 8 zijn overbodig, je kan in je query al je $_POST variabelen gebruiken. Overkopieeren in een andere variabele is niet echt zinnig, en kan leiden tot onduidelijkheden in de code.
- Zorg voor beveiliging tegen SQL-inection, en gebruik over alle POST-, GET- en COOKIE-variabelen in je mysql_query de mysql_real_escape_string() functie.
- Haal variabelen buiten quotes.
- Controleer of $query gelukt is.
Gewijzigd op 02/11/2012 16:06:14 door - Ariën -
 
Jos Vermassen

Jos Vermassen

02/11/2012 16:10:15
Quote Anchor link
- Aar - op 02/11/2012 16:05:50:
Twee velden in de database aanmaken in de data met de namen
- activation_code (varchar 32)
- activated (ENUM '0','1')

Zodra iemand geregistreerd is geef je het veld activated de waarde 0 mee (kan je ook als standaardwaarde gebruiken), en maak je met een mt_srand() een unieke code aan, welke je in activation_code opslaat. Bij voorkeur kan je deze door md5() heenhalen om hem tot 32 tekens te brengen.

Als ik nog een paar tips mag geven:
- Lijn 6 t/m 8 zijn overbodig, je kan in je query al je $_POST variabelen gebruiken. Overkopieeren in een andere variabele is niet echt zinnig, en kan leiden tot onduidelijkheden in de code.
- Zorg voor beveiliging tegen SQL-inection, en gebruik over alle POST-, GET- en COOKIE-variabelen in je mysql_query de mysql_real_escape_string() functie.
- Haal variabelen buiten quotes.
- Controleer of $query gelukt is.


Oké bedankt, even toepassen.
Gewijzigd op 02/11/2012 16:21:44 door Jos Vermassen
 
Tim S

Tim S

02/11/2012 16:23:48
Quote Anchor link
Je kan op de pagina waar ze kunnen inloggen kijken of het wachtwoord en bebruikersnaam overeenkomen met die in de database.

Boven aan deze pagina zet je session_start();

Als het wachtwoord en gebruiersnaam overeen komen kan je doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$_session
['auth'] = "yes";
//en doorsturen naar een beveiligde pagina en eventueelnandere codes uitvoeren
?>


Op elke beveiligde pagina kan je dan zetten

Session_start();
if(@$_SESSION['auth'] = ! "yes")
{
En dan hier doorverwijzen naar de inlog pagina omdat de gebruiker schrijnbaar niet is imgelogd
Exit();
}
Gewijzigd op 02/11/2012 16:24:30 door Tim S
 
Obelix Idefix

Obelix Idefix

02/11/2012 16:24:31
Quote Anchor link
Jos, het citeren van complete teksten is niet nodig, zeker niet als het direct erboven staat.

Ten aanzien van je code:
Je kopieert eerst variabelen en controleert dan pas of ze bestaan. :s
Waarom eigenlijk variabelen kopiëren?
mysql_real_escape_string gebruik je in een query.
Waarom bij je password mysql_real_escape_string gebruiken? Je beveiligt dit toch? Dan blijft er geen onveilige code over.
Overigens schijnt md5 alleen tegenwoordig niet meer voldoende te zijn. Kijk naar/Zoek op salt + pepper.
Variabelen in je query beter buiten quotes.
Gewijzigd op 02/11/2012 16:25:26 door Obelix Idefix
 
Jos Vermassen

Jos Vermassen

02/11/2012 16:52:45
Quote Anchor link
Het lukt me al om een activatie code te genereren en ze in de databank te zetten. Maar als ik op de link in de mail klik, wordt mijn activatie code niet op null gezet en mijn veld "actief" niet op 1. Wat doe ik fout?

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
<?php
//query gelukt
echo 'Er is een email gestuurd naar '.$_POST['email'].' met een activatiecode';
            
//email sturen
$adres = $_POST['email'];
$onderwerp = "website - Registratie";
$bericht = "Welkom op onze website! Om de registratie te voltooiien link:http://www.yannickluijten.be/luc/login/register.php?$activatie_code";
$headers = 'From: [email protected]' .
                   'Reply-To: [email protected]' .
           'X-Mailer: PHP/'.phpversion();
mail($adres, $onderwerp, $bericht, $headers);
            
//activeren
$string = $_SERVER['string'];
$select = mysql_query("SELECT * FROM gebruikers");
            
//controle nog maken
while($row = mysql_fetch_array($select))
{

    if ($string == $row['activatie_code'])
    {

        echo "Proficiat!" . $row["username"] . " Je bent geregistreerd.";
        $update = mysql_query("UPDATE gebruikers SET activatie_code = '', actief='1' WHERE id=$row[id]");
        if (!$update)
        {

            echo "Registratie mislukt";
        }
    }
}

?>
Gewijzigd op 02/11/2012 17:00:39 door Jos Vermassen
 
Obelix Idefix

Obelix Idefix

02/11/2012 17:14:08
Quote Anchor link
Jos: begin eens met het doorlezen van een paar (goede) basistut's. Afgaande op wat je nu doet heb je hele leuke ideeën, maar heb je geen idee hoe je het moet aanpakken. Lees/Leer eens foutafhandeling. Het logisch opbouwen van een pagina.

Ten aanzien van je code:
Beveilig je output regel 3.
Waarom kopieer je op regel 6?
Je mailbericht: zorg dat er een echte link staat, zodat mensen alleen maar hoeven te klikken. Dat zal nu naar mijn idee niet het geval zijn (er staat alleen platte tekst).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
register.php?$activatie_code
Denk dat dit niet gaat werken.
Plaats variabelen buiten quotes.
Hoe ga je controleren; er is niets waar je die code aan toekent.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
register.php?activatiecode=".$activatie_code


Je $headers zijn onvolledig.
Je controleert nergens of je mail verstuurd is.

Wat wil je bereiken met de code op regel 15 t/m 30?
Wat doe je op regel 15?
Waar is de foutafhandeling op bij je query (regel 16).
Selecteer het veld/de velden die je wilt ipv *
Er wordt nergens gekeken of iemand op een link heeft geklikt. Dus dat kan het niet zijn.
Wat wil je dan bereiken met een update-query?
 



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.