activatie account

Status
Niet open voor verdere reacties.

falcojugger

Gebruiker
Lid geworden
29 dec 2008
Berichten
279
Hallo allemaal.
Ik ben momenteel met uitgebreid ledensysteem bezig.
Nou is het ook zo dat ik een activatiemail verstuur bij het registreren.

De activatielink wordt gemaakt door een vast stuk te pakken: de pagina activatie.php
met daarachter ?link=(md5hash van wachtwoord)
als resultaat komt er iets uit als: http://localhost/activate.php?link=4216455ceebbc3038bd0550c85b6a3bf

vervolgens wil ik de hash (GET-methode) vergelijken met wat tijdens de registratie is ingevoerd in de database (dezelfde hash), als deze gelijk zijn dan moet hij een waarde (het zogenaamde gebruikersniveau) een nieuwe waarde geven, zodat deze als "geactiveerd" wordt gezien.

ik gebruik hierbij het volgende script.
als ik dit script laat werken, foutmelding: undefined index password on line 16

PHP:
<?php
session_start();
require_once "config.php";

// Als er werkelijk vanuit een activatiemail gelinkt wordt -> activeren
if(isset($_GET['link']))
{
	$activatiecode = $_GET['link'];
	$gegevens = mysql_query("SELECT id, user, level FROM users WHERE password='".$activatiecode."'") or die ("Error connecting to database");
	
	// Controle of het bestaat in de database
	if(mysql_num_rows($gegevens) > 0) {
		$row = mysql_fetch_assoc($gegevens);
			
		// Wachtwoord controleren
		if($row['password'] == $activatiecode)
		{
			// Gebruiker is al geactiveerd
			if($row['level'] != 0){
				echo "Account is al geactiveerd.";
				header('refresh:3 url=login.php');
			}
			else{
				$res = mysql_query("UPDATE level VALUE('1') WHERE ".$row['password'] == $activatiecode) or die ("Error connecting to database");
			}
				
		} 
			
	    else 
	    {
			echo "Ongeldige Activatiecode.";
			header('refresh:3 url=index.php');
		}
	}
}

// Hacker poging? gewoon doorsturen
else
{
	header('Location: index.php');
}
?>

bovendien weet ik niet of de volgende regel:
Code:
$res = mysql_query("UPDATE level VALUE('1') WHERE ".$row['password'] == $activatiecode) or die ("Error connecting to database");
goed is. maar daar ben ik verder nog niet aan toegekomen
 
Je haalt het veld 'password' niet uit de database, dus die komt ook niet voor in je array. Kun je makkelijk aanpassen door:

PHP:
$gegevens = mysql_query("SELECT id, user, level, password FROM users WHERE password='".$activatiecode."'") or die ("Error connecting to database");

te gebruiken ipv
PHP:
$gegevens = mysql_query("SELECT id, user, level FROM users WHERE password='".$activatiecode."'") or die ("Error connecting to database");

Die UPDATE-query is nog niet goed, maar daar laat je zelf nog wel even mee spelen. Dan horen we wel als het niet lukt.

EDIT: die controle is trouwens wel een beetje overbodig. Je krijgt van MySQL alleen waarden terug die daaraan voldoen.
 
Laatst bewerkt:
Eh, het is een beetje riskant om als hash een md5 van het password te gebruiken... die zijn namelijk redelijk goed te breken.

Ik zou daar nog wat meer informatie in verstoppen, misschien, door bijv een stukje random tekst (wel iedere keer hetzelfde ofc) ervoor of erna te plakken. Op die manier kunnen mensen niets afleiden van de hash.
 
owja, dat zal ik eens even gaan proberen.
lag vannacht in bed en bedacht dat die controle inderdaad niet nodig is want is dubbelop.

bedankt voor de tip van die hash ;) stukje randomcode is wel handig
 
Ik heb op mijn eigen website ook een registreer systeem met activatie code gemaakt. Ik maak een code van 30 karakters lang, met cijfers, kleine letters en hoofdletters.

Ik check voordat deze in de database wordt gezet wel eerst of er nog geen ander is met die code. De kans bij een 30 karakter lange code is natuurlijk klein, maar je weet het nooit!.

Verder zijn er meerdere mogelijk heden om een hash te maken. Maak gebruik van meerdere functies voor hashes. Bijvoorbeeld: md5(sha1("test")). Je kunt zelfs nog meerdere achter elkaar doen. Niemand weet welke volgorde en hoeveel, dus ook zeer moeilijk te kraken.

Wat ik verder gedaan heb is een activatiecode in de database zetten en emailen. En als de persoon op de link heeft geklikt en het klopt met de code wordt in de database die cel leeggemaakt. Controle bij inloggen: Als die cel leeg is betekent dat, dat het account is geactiveerd!

Succes ermee,

Gr. Ronald!:)


Dit zou ik dan als code doen:
PHP:
<?php
session_start();
require_once "config.php";
 
// Als er werkelijk vanuit een activatiemail gelinkt wordt -> activeren
if(isset($_GET['link'])){
    $activatiecode = $_GET['link'];
    $gegevens = mysql_query("SELECT * FROM users WHERE actcode='".$activatiecode."'") or die ("Error: ".mysql_error());
    
    // Controle of het bestaat in de database
    if(mysql_num_rows($gegevens) == 1) {
        $query = "UPDATE users SET actcode = ''";
        $sql = mysql_query($query);
        if(isset($sql)){
            echo("Het account is geactiveerd. U kunt nu inloggen.");
        } else {
            echo("Het account kan niet geactiveerd worden");
        }
    } else {
       echo("De opgegeven activatiecode is onjuist of niet in gebruik.");
    }
} else {
    header("Location: index.php");
}
?>
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan