Gå til innhold

Et bra email verification system?


Anbefalte innlegg

Heisann, lurte bare på om noen vet om et bra PHP email verification system som funker. Har allerede registrerings form, login form, forum og alt sånn men jeg vil ikke at folk skal lage hundrevis av medlemmer å spamme på forumet osv.

 

Har testet noen av dem som allerede ligger ute men det ser ikke ut som de som har lagt dem har testet dem for de er fulle av errors.

 

Takk på forhånd :D

Lenke til kommentar
Videoannonse
Annonse

Om du har PHP 5.2, så absolutt. Da lærte jeg noe nytt idag jeg og, den linken må nesten bokmerkes :)

 

ÅJA, jeg mente den andre email verification, ikke validation.. umm. Sånn at de må klikke på en activation link for og registrere seg på emailen sin.

 

Bruker 5.2 ja...

Endret av WeExClan
Lenke til kommentar

Okei, forsto det ikke helt, hvordan kan jeg endre denne til og bli sånn? :

 

<?php

//signup.php
include 'connect.php';

echo '<h3>Registrer deg</h3><br />';

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
   /*the form hasn't been posted yet, display it
  note that the action="" will cause the form to post to the same page it is on */
   echo '<form method="post" action="">
	 	Brukernavn: <input type="text" name="user_name" /><br />
		Passord: <input type="password" name="user_pass"><br />
	Bekreft Passord: <input type="password" name="user_pass_check"><br />
	Email: <input type="email" name="user_email"><br />
		<input type="submit" value="Registrer deg" />
	 </form>';
}
else
{
   /* so, the form has been posted, we'll process the data in three steps:
	1.	Check the data
	2.	Let the user refill the wrong fields (if necessary)
	3.	Save the data 
*/
$errors = array(); /* declare the array for later use */

if(isset($_POST['user_name']))
{
	//the user name exists
                                  $userName = $_POST['user_name'];
	if(strlen($_POST['user_name']) > 30)
	{
		$errors[] = 'Viss du har symboler og tegn i navnet ditt som "_" eller "/", osv. Send en mail til meg: [email protected], da legger jeg inn allt manuelt i systemet til vi fikser denne feilen.  :-D';
	}
	if(strlen($_POST['user_name']) > 30)
	{
		$errors[] = 'Brukernavnet kan ikke inneholde mer enn 30 bokstaver og tall.';
	}
}
else
{
	$errors[] = 'Brukernavn feltet er tomt, DUH!.';
}


if(isset($_POST['user_pass']))
{
	if($_POST['user_pass'] != $_POST['user_pass_check'])
	{
		$errors[] = 'Passordene matcher ikke, fiks det!';
	}
}
else
{
	$errors[] = 'Passord feltet kan jo ikke være tomt, er du helt tett i pappen eller?';
}

if(!empty($errors)) /*check for an empty array, if there are errors, they're in this array (note the ! operator)*/
{
	echo 'Uh-oh.. a couple of fields are not filled in correctly..<br /><br />';
	echo '<ul>';
	foreach($errors as $key => $value) /* walk through the array so all the errors get displayed */
	{
		echo '<li>' . $value . '</li>'; /* this generates a nice error list */
	}
	echo '</ul>';
}
else
{
	//the form has been posted without, so save it
	//notice the use of mysql_real_escape_string, keep everything safe!
	//also notice the sha1 function which hashes the password
	$query = sprintf("INSERT INTO `users` (`user_name`, `user_pass`, `user_email`, `user_date`, `last_online`, `user_level`, 				`user_ip`) VALUES 
	('%s', '%s', '%s', NOW(), NOW(), '%s', '%s')",
 		mysql_real_escape_string($_POST['user_name']),
 		sha1($_POST['user_pass']),
  		mysql_real_escape_string($_POST['user_email']),
   		$_SERVER['REMOTE_ADDR']);

	//debug
	echo $query."<br />"; // sjekk at sql'en ser riktig ut

	$result = mysql_query($sql);
	if(!$result)
	{
		//something went wrong, display the error
		echo 'Something went wrong while registering. Please try again later.';
		//echo mysql_error(); //debugging purposes, uncomment when needed
	}
	else
	{
		echo 'Din registrering er nå fullført,  <a href="signin.php">logg inn</a> og start postinga :-)';
	}
}
}
?>

Lenke til kommentar

Du legger til et felt til i databasen. f.eks user_verification.

 

Du legger da til det samme feltet i queryen din, og i det er infoen du skal sette inn md5($epost). Du sender samtidig en epost til brukeren, som inneholder http://websiden.din/activate.php?id=innholdetiuserverification

 

I activate.php har du en kode alà dette:

 

<?php
$id = formforbeskyttele($_REQUEST['id']);

if(isset($id)) {
$select = sprintf("SELECT * FROM `brukertabell` WHERE `user_verification` = '%s'",
  $id);

if(mysql_query($select)) {
// Oppdater user_verification til TRUE.
}
}
?> 

 

( Den koden vil neppe fungere uten små endringer. )

Endret av Sk!ppy
Lenke til kommentar

Du legger til et felt til i databasen. f.eks user_verification.

 

Du legger da til det samme feltet i queryen din, og i det er infoen du skal sette inn md5($epost). Du sender samtidig en epost til brukeren, som inneholder http://websiden.din/activate.php?id=innholdetiuserverification

 

I activate.php har du en kode alà dette:

 

<?php
$id = formforbeskyttele($_REQUEST['id']);

if(isset($id)) {
$select = sprintf("SELECT * FROM `brukertabell` WHERE `user_verification` = '%s'",
  $id);

if(mysql_query($select)) {
// Oppdater user_verification til TRUE.
}
}
?> 

 

( Den koden vil neppe fungere uten små endringer. )

Skal prøve det. Men er dette en ny fil eller den samme, og er $id user_id i mitt tilfelle?

Lenke til kommentar

Tror kanskje du må lese litt mer på logikk ang. koding. Jeg kan nesten ikke hjelpe så veldig mye mer nå føler jeg, uten å kode for deg - og det har jeg ikke tenkt til. ( Jeg drar vekk en uke nå, så nå må nesten noen andre hjelpe deg fra kl 8 imorgen )

Lenke til kommentar

[..]Har allerede registrerings form, [..]

..som også sender ut en e-post til vedkommende eller?

 

Hvis ikke trenger du dette først (ta en titt på mail() i php).

 

Etter det er gjort må du skrive kode som sørger for at det også sendes en lenke i e-posten, der denne vil inneholde en aktivasjons-ID som du fra før har generert utifra f.eks. de oppgitte opplysningene, kanskje et par tilfeldig tall og/eller et klokkeslettet (for å gjøre den så unik som mulig).

 

Når brukeren så senere klikker på / taster inn den oppgitte adressen må siden din sjekke for oppgitte aktivasjons-IDer, og så gjøre et eller annet.

Endret av greygenic
Lenke til kommentar

Når brukeren blir registrert, så regner jeg med at du lagrer all data i en database?

 

Isåfall, bare legg til et nytt felt i brukertabellen(i databasen altså) din som du kan kalle for user_verification.

 

Når brukeren trykker registrer, så får du PHP til å generere en md5 eller en sha1 hash, og lagrer denne også til databasen, med alle den andre informasjonen.

 

Så bruker du mail() til å sende brukeren en mail med en link til en side på din server (som kan ta imot GET variabler), med hashen som en GET variabel.

 

# [...] tidligere kode
$result = mysql_query($sql);
if(!$result)
{
//something went wrong, display the error
echo 'Something went wrong while registering. Please try again later.';
//echo mysql_error(); //debugging purposes, uncomment when needed
}
else
{
$lastID = mysql_insert_id(); // Brukerens ID (Henter siste id som ble satt inn)
$hash = sha1($lastID); // Lager en hash

// DERETTER GJØR DU
# 1) Lagre denne hashen til databasen
# 2) Bruker mail() til å sende en mail til brukerens email,
#    med en link som ber brukeren om å gå til activate.php?hash=$hash.
#    Med andre ord -- echo "<a href='activate.php?hash=" . $hash . "'>Trykk her for å aktivere din konto</a>"; -- 

	echo 'Din registrering er nå fullført,  <a href="signin.php">logg inn</a> og start postinga :-)';
}

 

På denne siden som skal ta imot denne hashen, må du sjekke om hashen finnes i databasen, også aktivere brukeren hvis den gjør det. Det er enkle sql spørringer, så det burde gå greit. Her er et lite hint..

 

<?php

// File: activate.php
// Desc: Aktivere brukere ved email registrering. Sjekker hash opp mot databasen.

if($_GET["hash"]) {

// Det ble sendt med en hash, sjekk den opp mot en database også aktiver brukeren.

} else {

// Hvis det ikke ble sendt med noen hash, altså hvis noen går til activate.php, uten å sende ved ?hash=jdhadaigfahfaqufauaui osv.
echo "Ingen hash ble sendt med. Prøv å trykk på linken i mailen på nytt.";

}

?>

Endret av Lek1
Lenke til kommentar

Ok, email... Kommer det inn her?

 

 // DERETTER GJØR DU
       # 1) Lagre denne hashen til databasen
       # 2) Bruker mail() til å sende en mail til brukerens email,
       #    med en link som ber brukeren om å gå til activate.php?hash=$hash.
       #    Med andre ord -- echo "<a href='activate.php?hash=" . $hash . "'>Trykk her for å aktivere din konto</a>"; -- 

               echo 'Mail her?';
}

 

 

Som dette?(har ikke lagt selve mailen enda..)

 

 // DERETTER GJØR DU
       # 1) Lagre denne hashen til databasen
       # 2) Bruker mail() til å sende en mail til brukerens email,
       #    med en link som ber brukeren om å gå til activate.php?hash=$hash.
       #    Med andre ord -- echo "<a href='activate.php?hash=" . $hash . "'>Trykk her for å aktivere din konto</a>"; -- 

               echo '$to      = '$user_mail';
$subject = 'Email verifisering på WeEx.Tk';
$message = 'Blablabla';
$headers = 'From: [email protected]' . "\r\n" .
   'Reply-To: [email protected]' . "\r\n" .
   'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);';
}

 

 

SI IFRA HVIS NOE ER FEIL..

 

 

 

 

 

OG EN TING TIL:

 

HVA SKAL JEG SETTE INN I SQL FOR USER_VERIFICATION FELTET

 

HER:

$sql = "INSERT INTO
				users(user_name, user_pass, user_email ,user_date, user_level)
			VALUES('" . mysql_real_escape_string($_POST['user_name']) . "',
				   '" . sha1($_POST['user_pass']) . "',
				   '" . mysql_real_escape_string($_POST['user_email']) . "',
					NOW(),
					0)";

Endret av WeExClan
Lenke til kommentar

Hvis du bruker Lek1 sin løsning må du da bare oppdatere databasen med hashen...

 

$sql = 'UPDATE users SET user_verification = '.$hash.' WHERE id = '.$lastID.'';
mysql_query($sql);

 

Nå må du da først opprette user_verification feltet i databasen din da. Siden det er snakk om en sha1() hash er det 40 tegn. Er litt usikker på om du har forstått hvordan man gjør det så jeg legger ved et bilde.

post-119348-1276028200,658_thumb.jpg

Endret av Warz
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...