Miglioramento controlli su input

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ho creato un form molto leggero e giusto di prova per poi migliorarlo. di seguito il codice.
PHP:
<?php 

	include 'header.php';
	
?>

	<div id="wrapper">
	
	<?php 

		if(!isset($_GET['passkey'])){
		
			if(!isset($_POST['invia'])){ ?>
			
				<form method="post" action="#" id="formregistrazione">
					
					<ul>
						<li><label for="username">Username</label>
							<input type="text" name="username" id="username" />
						</li>
						<li>
							<label for="password1">Password</label>
							<input type="password" name="password1" id="password1" />
						</li>
						<li>
							<label for="password2">Ripeti Password</label>
							<input type="password" name="password2" id="password2" />
						</li>
						<li>
							<label for="email">Email</label>
							<input type="text" name="email" id="email" />
						</li>
					</ul>
						<input type="submit" name="invia" id="registrati" value="Registrati" />
				</form>
			
	<?php	} else {
				
				// creazione di un codice di conferma
				$codiceconferma = md5(uniqid(rand()));
				
				// Valori del form
				
				$username = mysql_real_escape_string($_POST['username']);
				$password1 = mysql_real_escape_string($_POST['password1']);
				$password2 = mysql_real_escape_string($_POST['password2']);
				$email = mysql_real_escape_string($_POST['email']);
			
				// controllo campi vuoti e password
				
				if($username == "" || $email == ""){
					echo "Devi riempire tutti i campi";
				}elseif($password1 == "" || $password2 == ""){
					echo "Devi riempire tutti i campi";
				}elseif($password2 != $password1){
					echo "Le password devono coincidere";
				}else{
					
					$recuperauseremail = mysql_query("SELECT id FROM utenti WHERE username='$username' OR email='$email'");	
					$contausermail = mysql_num_rows($recuperauseremail);
					
					if($contausermail > 0){
					
						echo "Nome utente o email già disponibili";
					
					} else {
					
						// Invia dati alla tb utenti_temp
						
						$inviautentitemp = mysql_query("INSERT INTO utenti_temp (codiceconferma, username, password, email) VALUES ('$codiceconferma', '$username', '$password2', '$email')");
						
						if($inviautentitemp){
							
							$to=$email;
							$subject="Conferma la Registrazione";
							$header="Da: Amministratore";
							$message="Ecco il tuo codice di attivazione \r\n";
							$message.="Clicca sul link per confermare la registrazione \r\n";
							$message.="http://siti/Biblionet%20test%20MySql/register.php?passkey=$codiceconferma";
							
							$sentmail=mail($to,$subject,$message,$header);
						
						}
						
						if($sentmail){
						
							echo "Per completare la registrazione controlla la tua casella di posta elettronica e clicca sul link di attivazione.";
							
						}else{
						
							echo "Errore, link di attivazione non inviato.";
						
						}
					
					}
				}
				
			}
		
		} else {
			
			$passkey = $_GET['passkey'];
			
			$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'";
			$risultatouser = mysql_query($sqlrecuperauser);
			
			if($risultatouser) {
			
				$contauser = mysql_num_rows($risultatouser);
				
				if($contauser == 1){
				
					$rows = mysql_fetch_array($risultatouser);
					$username = $rows['username'];
					$email = $rows['email'];
					$password = $rows ['password'];
					
					$passwordcript = md5($password);
					
					$sqlconfermauser = mysql_query("INSERT INTO utenti (username, password, email) VALUES ('$username', '$passwordcript', '$email')");
					
					if ($sqlconfermauser) {
					
						echo "Il tuo account è stato attivato con successo";
						$sqleliminadati = mysql_query("DELETE FROM utenti_temp WHERE codiceconferma = '$passkey'");
					
					} else {
					
						echo "Errore!";
					
					}
				
				}
			
			}
			
		}

	?>
	
	
	</div>
	
	
</body>
</html>

ed il file della pagina di login
PHP:
<?php

	include 'header.php';

?>

	<div id="wrapper">
	
    	<?php
        	
			$p = $_GET['azione'];
			
			// Azione per il login
			if($p == "login"){
				
				if(!isset($_POST['invia'])){ ?>
			
					<form method="post" action="#" id="formlogin">
                    
						<label for="username">Username</label>
						<input type="text" name="username" id="username" /><br>                    
						<label for="password">Password</label>
						<input type="password" name="password" id="password" /><br>
						<input type="submit" name="invia" id="login" value="Accedi" />
                    
					</form>
                    
<?php			} else {
							
					$username = mysql_real_escape_string($_POST['username']);
					$password = mysql_real_escape_string($_POST['password']);
					
					if($username == "" || $password == ""){
					
						echo "Devi compilare tutti i campi";
						
					} else {
						
						$password_crypt = md5($password);
								
						$recuperadati = mysql_query("SELECT * FROM utenti WHERE username = '$username' AND password = '$password_crypt'");
								
						$verificadati = mysql_num_rows($recuperadati);
								
						if($verificadati == 1) {
									
							$sessione = mysql_fetch_array($recuperadati);
							$_SESSION['utente'] = $sessione['username'];
							echo "Login effettuato con successo!";
							header("Refresh: 2; URL= index.php");	
							
						} else {
									
							echo "Dati non presenti nel database!";
							
						}
								
					}
							
				}
				
				
			// Azione del logout					
			} elseif ($p == "logout"){
					
				session_destroy();
				echo "Logout effettuato con successo!";
				header("Refresh: 2; URL= index.php");				
			
			}
			
			
			
		?>
		


	</div>

</body>
</html>

Come potrei migliorarlo? Come potrei migliorare il controllo su gli input dopo il suggerimento di borgo italia ?

Grazie e tutti
 

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
PHP:
$passkey = $_GET['passkey']; 
$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'";

ATTENZIONE!!!
Secondo me si fa una SQL injection in 2 secondi...
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
intanto per la passkey
sistema più semplice:
PHP:
<?php
//..........
} else {
	$passkey = htmlspecialchars($_GET['passkey']); 
//...eccetera
?>
oppure dato che è mdcinquata quindi dovrebbe essere solo caratteri asci alfanumerici
PHP:
<?php
//..........
} else {
	$passkey = htmlspecialchars($_GET['passkey']); 
	if(preg_match("/^[A-Za-z0-9]$/", $passkey )){
		//faccio quello che devo fare
	
	}else{
		echo "errore: la chiave non è corretta";
		//e un rimando automatico a dove vuoi
	}
	
 
//...eccetera
?>
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Buongiorno, potrebbe andare bene in questo modo secondo voi?

come dice borgo faccio il controllo e poi se corrisponde prosegue nel caso non fosse giusto esce l'errore di contattare un responsabile
PHP:
else {
			
			$passkey = htmlspecialchars($_GET['passkey']); 
			if(preg_match("/^[A-Za-z0-9]$/", $passkey)){       // Qua controllo se corrisponde
				
			$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'"; // qua se positivo all'if recupero i dati dal db e proseguo
			$risultatouser = mysql_query($sqlrecuperauser);
			
			} else {
				
				echo "C'è stato un errore nella registrazione, riprovare o mandare una mail al gruppo."; // se non coincide, lascio un avviso.
				
			} if($risultatouser) {
			
				$contauser = mysql_num_rows($risultatouser);
				
			if($contauser == 1){
				
					$rows = mysql_fetch_array($risultatouser);
					$username = $rows['username'];
					$email = $rows['email'];
					$password = $rows ['password'];
					
					$passwordcript = md5($password);

quello che non mi è chiaro è che cosa dovrebbe succedere nel caso la funzione preg_match non dia esito positivo. Da cosa può dipendere visto che è un semplice controllo. Notare che chi si registra viene prima inserito in una tabella utenti temporanea dove la pass è in chiaro e dopo conferma via mail inserito nella tabella utenti quella definitiva con pass criptata.
Inoltre stavo pensando di mandare una mail di conferma ed avvenuta registrazione all'utente con user e pass in chiaro. Però dopo la conferma via mail la pass viene criptata. Come potrei fare?
Grazie a tutti
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
è che cosa dovrebbe succedere nel caso la funzione preg_match non dia esito positivo
se è negativo vuol dire che qualcuno ha cercato di accedere fraudolentemente, quindi metti un riinvio immediato e automatico ad una pagina (es alla home)
devi poi fare le varie operazioni solo e solamente solo se il controllo è stato positivo.


per gli altri controlli io farei così, ti metto i pattern solo per caratteri alfanumerici se vuoi altri caratteri modificali
PHP:
<?php
//$t = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
function ver_testo($t,$mi,$m){
	if(preg_match("/^[A-Za-z0-9]{$mi,$m}$/", $t)){
		//testo ok
		return TRUE;
	}else{
		return FALSE;
	}
}
//......       
// creazione di un codice di conferma
$codiceconferma = md5(uniqid(rand()));
// Valori del form
$username = trim($_POST['username']);
$password1 = trim($_POST['password1']);
$password2 = trim($_POST['password2']);
$email = trim($_POST['email']);
//metto a vuoto messagggio di errore
$ok_ko="";
if(!ver_testo($username,3,8)){$ok_ko.="username non corretto<br />";}
if(!ver_testo($password1,6,12)){$ok_ko.="prima password non corretta<br />";}
if(!ver_testo($password2,6,12)){$ok_ko.="seconda password non corretta<br />";}
if($password1 != $password2){$ok_ko.="le password non coincidono<br />";}
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){$ok_ko.="indirizzo email non valido<br />";}
if($ok_ko==""){//se è rimasto vuoto non ci sono errori
	//fai quello che devi fare
}else{
	echo $ok_ko;
	//ritorno a dove vuoi tu es.
	//header("location: pagina_che_vuoi_tu.php");
}
?>
poi non manderei la pass per email (non si sa mai chi la riceve e/o la legga). del resto quando uno si iscrive scrive lui la pass quindi metti un avviso di ricordarsela e poi la passi dalla temporanea alla tabella utenti definitiva così com'è
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ok grasiasss.
Potrei inserire in modulo recupera password nel caso l'utente se la sia dimenticata. Ho trovato su questo sito un utilissimo articolo prpoprio sul recupero password tramite form. Analizzo il tuo commento e provo.
Comunque ragazzi fare tutto da se in pochissimo tempo e senza qualcuno che ti dia una mano, eccezione fatta per questo forum, è veramente complicato. Ma ho davanti ancora 15 gg di ferie forzate. :crying::cool:
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ma le cariabili $t, $mi, $m non devo dichiararle?
PHP:
//$t = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
function ver_testo($t,$mi,$m){
    if(preg_match("/^[A-Za-z0-9]{$mi,$m}$/", $t)){
        //testo ok
        return TRUE;
    }else{
        return FALSE;
    }
}
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
ehem, ehm...
io grauderei un po' come funziano le funzioni.
quelle che tu chiami variabili (quelle scritte tra le parentesi) sono diciamo dei "segnaposti" che vengono in seguito sostituiti quando utilizzi la funzione
ver_testo($username,3,8)
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
ciao
ehem, ehm...
io grauderei un po' come funziano le funzioni.
quelle che tu chiami variabili (quelle scritte tra le parentesi) sono diciamo dei "segnaposti" che vengono in seguito sostituiti quando utilizzi la funzione
ver_testo($username,3,8)

:book::book::D
e lo so sono un novello!!! Sorry. E' che ci sono così tante cose da controlloare e imparare che diciamo ho un pò di confusin in testa. Visto che il controllo della lunghezza di username pass ed email lo faccio tramite un file javascript secondo te è inutile questo?
PHP:
//$t = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
function ver_testo($t,$mi,$m){
    if(preg_match("/^[A-Za-z0-9]{$mi,$m}$/", $t)){
        //testo ok
        return TRUE;
    }else{
        return FALSE;
    }

Il file jS è questo
PHP:
// JavaScript Document
jQuery(document).ready(function($){
	
	// Validazione
	
	$("*formregistrazione").validate({
		
		// regole
		rules:{
			username:{
				required: true,
				minlength: 4,
				maxlength: 10
			},
			
			password1:{
				required: true,
				minlength:4,
				maxlength:12,
			},
			
			password2:{
				required: true,
				equalTo:"#password1"
			},
			
			email:{
				required: true,				
				email: true
			},
			
		},
		//messaggi errore	
		
		messagge:{
			username:{
				required: "Devi inserire il tuo Username",
				minlength: "L'username deve avere almeno 4 caratteri",
				maxlength: "L'username deve essere lungo al massimo 10 caratteri"
			},
			
			password1:{
				required: "Devi inserire la password",
				minlength:"La password deve essere lunga almeno 4 caratteri",
				maxlength:"La password deve essere lunga almeno 12 caratteri",
				
			},
			
			password2:{
				required: "Inserisci la password",
				equalTo:"Le password devono conincidere"
			},
			
			email:{
				required: "Devi inserire la mail",				
				email: "Inserisci una email valida"
			},
			
			
			
		},
		
	});
	
	
	
	
	})
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
qualsiasi controllo js (lato client) può essere facilmente superato, quelli lato server (php opera lato server) molto più difficilmente.
i controlli lato client hanno solo il vantaggio di essere più scenografici
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Perdonami ma sto diventando matto. Dove devo inserire questo codice?
PHP:
//$t = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
function ver_testo($t,$mi,$m){
    if(preg_match("/^[A-Za-z0-9]{$mi,$m}$/", $t)){
        //testo ok
        return TRUE;
    }else{
        return FALSE;
    }
}

assumendo che la variabile $t sia la mia $passkey a che punto del mi codice dovrò inserirlo?
questo è il mio codice
PHP:
<?php 

	include 'header.php';
	
?>

	<div id="wrapper">
	
	<?php 

		if(!isset($_GET['passkey'])){
		
			if(!isset($_POST['invia'])){ ?>
			
				<form method="post" action="#" id="formregistrazione">
					
					<ul>
						<li><label for="username">Username</label>
							<input type="text" name="username" id="username" />
						</li>
						<li>
							<label for="password1">Password</label>
							<input type="password" name="password1" id="password1" />
						</li>
						<li>
							<label for="password2">Ripeti Password</label>
							<input type="password" name="password2" id="password2" />
						</li>
						<li>
							<label for="email">Email</label>
							<input type="text" name="email" id="email" />
						</li>
					</ul>
						<input type="submit" name="invia" id="registrati" value="Registrati" />
				</form>
			
	<?php	} else {

				// creazione di un codice di conferma
				$codiceconferma = md5(uniqid(rand()));
				
				// Valori del form
										
				$username = mysql_real_escape_string($_POST['username']);
				$password1 = mysql_real_escape_string($_POST['password1']);
				$password2 = mysql_real_escape_string($_POST['password2']);
				$email = mysql_real_escape_string($_POST['email']);
			
				// controllo campi vuoti e password
				
				if($username == "" || $email == ""){
					echo "Devi riempire tutti i campi";
				}elseif($password1 == "" || $password2 == ""){
					echo "Devi riempire tutti i campi";
				}elseif($password2 != $password1){
					echo "Le password devono coincidere";
				}else{
					
					$recuperauseremail = mysql_query("SELECT id FROM utenti WHERE username='$username' OR email='$email'");	
					$contausermail = mysql_num_rows($recuperauseremail);
					
					if($contausermail > 0){
					
						echo "Nome utente o email già disponibili";
					
					} else {
					
						// Invia dati alla tb utenti_temp
						
						$inviautentitemp = mysql_query("INSERT INTO utenti_temp (codiceconferma, username, password, email) VALUES ('$codiceconferma', '$username', '$password2', '$email')");
						
						if($inviautentitemp){
							
							$to=$email;
							$subject="Conferma la Registrazione";
							$header="Da: Amministratore";
							$message="Ecco il tuo codice di attivazione \r\n";
							$message.="Clicca sul link per confermare la registrazione \r\n";
							$message.="http://siti/Biblionet%20test%20MySql/register.php?passkey=$codiceconferma";
							
							$sentmail=mail($to,$subject,$message,$header);
						
						}
						
						if($sentmail){
						
							echo "Per completare la registrazione controlla la tua casella di posta elettronica e clicca sul link di attivazione.";
							
						}else{
						
							echo "Errore, link di attivazione non inviato.";
						
						}
					
					}
				}
				
			}
		
		} else {
			
			$passkey = htmlspecialchars($_GET['passkey']);
			if(preg_match("/^[A-Za-z0-9]$/", $passkey)){ //Controllo se corrisponde
				
				
			$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'"; //Se corrisponde prelevo i dati dal db utenti_temp e li trasferisco al db utenti
			$risultatouser = mysql_query($sqlrecuperauser);
			
			} else {
				
				echo "C'è stato un errore nella registrazione, riprovare o mandare una mail al gruppo.";
				header("Refresh: 2; URL= index.php"); 
				
			} if($risultatouser) {
			
				$contauser = mysql_num_rows($risultatouser);
				
			if($contauser == 1){
				
					$rows = mysql_fetch_array($risultatouser);
					$username = $rows['username'];
					$email = $rows['email'];
					$password = $rows ['password'];
					
					$passwordcript = md5($password);
					
					$sqlconfermauser = mysql_query("INSERT INTO utenti (username, password, email) VALUES ('$username', '$passwordcript', '$email')");
					
					if ($sqlconfermauser) {
					
						echo "Il tuo account è stato attivato con successo";
						$sqleliminadati = mysql_query("DELETE FROM utenti_temp WHERE codiceconferma = '$passkey'");
					
					} else {
					
						echo "Errore!";
					
					}
				
				}
			
			}
			
		}

	?>
	
	
	</div>
	
	
</body>
</html>

credo poi che il resto del codice che mi hai scritto vada poi a sostituire questo
PHP:
// Valori del form
										
				$username = mysql_real_escape_string($_POST['username']);
				$password1 = mysql_real_escape_string($_POST['password1']);
				$password2 = mysql_real_escape_string($_POST['password2']);
				$email = mysql_real_escape_string($_POST['email']);
			
				// controllo campi vuoti e password
				
				if($username == "" || $email == ""){
					echo "Devi riempire tutti i campi";
				}elseif($password1 == "" || $password2 == ""){
					echo "Devi riempire tutti i campi";
				}elseif($password2 != $password1){
					echo "Le password devono coincidere";
				}else{

Dammi conferma. Grazie
Ciao
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
si va a sostituire, mi raccomando poi controlla le graffe degli if.

edit.
non proprio a sostituire la parte
$username = mysql_real_escape_string($_POST['username']);
$password1 = mysql_real_escape_string($_POST['password1']);
$password2 = mysql_real_escape_string($_POST['password2']);
$email = mysql_real_escape_string($_POST['email']);
la metti dopo che hai fatto i controlli e che tutto sia ok
comunque ributta giu tutto il codice e postalo che eventualmente lo correggiamo
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Spero di aver fatto bene. Sinceramente ci sono due punti che non riesco a capire ho due errori alle righe 40 e 43. Mi dici se quello che ho scritto è corretto, grazie
PHP:
<?php 

	include 'header.php';
	
?>

	<div id="wrapper">
	
	<?php 

		if(!isset($_GET['passkey'])){
		
			if(!isset($_POST['invia'])){ ?>
			
				<form method="post" action="#" id="formregistrazione">
					
					<ul>
						<li><label for="username">Username</label>
							<input type="text" name="username" id="username" />
						</li>
						<li>
							<label for="password1">Password</label>
							<input type="password" name="password1" id="password1" />
						</li>
						<li>
							<label for="password2">Ripeti Password</label>
							<input type="password" name="password2" id="password2" />
						</li>
						<li>
							<label for="email">Email</label>
							<input type="text" name="email" id="email" />
						</li>
					</ul>
						<input type="submit" name="invia" id="registrati" value="Registrati" />
				</form>
			
	<?php	} else {
				
				function ver_testo($t,$mi,$m){						//$passkey = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
					if(preg_match("/^[A-Za-z0-9]{$mi,$ma}$/", $passkey)){
							//testo ok
							return TRUE;
						}else{
							return FALSE;
						}
				
				

				// creazione di un codice di conferma
				$codiceconferma = md5(uniqid(rand()));

				// Valori del form
				$username = trim($_POST['username']);
				$password1 = trim($_POST['password1']);
				$password2 = trim($_POST['password2']);
				$email = trim($_POST['email']);
				//metto a vuoto messagggio di errore
				$ok_ko="";
				if(!ver_testo($username,4,10)){$ok_ko.="username non corretto<br />";}
				if(!ver_testo($password1,6,12)){$ok_ko.="prima password non corretta<br />";}
				if(!ver_testo($password2,6,12)){$ok_ko.="seconda password non corretta<br />";}
				if($password1 != $password2){$ok_ko.="le password non coincidono<br />";}
				if(!filter_var($email, FILTER_VALIDATE_EMAIL)){$ok_ko.="indirizzo email non valido<br />";}
				if(!$ok_ko==""){//se è rimasto vuoto non ci sono errori
					 echo $ok_ko; //fai quello che devi fare
					 form();
				}else{
					echo $ok_ko;				
									
					$recuperauseremail = mysql_query("SELECT id FROM utenti WHERE username='$username' OR email='$email'");	
					$contausermail = mysql_num_rows($recuperauseremail);
				}
					
					if($contausermail > 0){
					
						echo "Nome utente o email già disponibili";
					
					} else {
					
						// Invia dati alla tb utenti_temp
						
						$inviautentitemp = mysql_query("INSERT INTO utenti_temp (codiceconferma, username, password, email) VALUES ('$codiceconferma', '$username', '$password2', '$email')");
						
						if($inviautentitemp){
							
							$to=$email;
							$subject="Conferma la Registrazione";
							$header="Da: Amministratore";
							$message="Ecco il tuo codice di attivazione \r\n";
							$message.="Clicca sul link per confermare la registrazione \r\n";
							$message.="http://siti/Biblionet%20test%20MySql/register.php?passkey=$codiceconferma";
							
							$sentmail=mail($to,$subject,$message,$header);
						
						}
						
						if($sentmail){
						
							echo "Per completare la registrazione controlla la tua casella di posta elettronica e clicca sul link di attivazione.";
							
						}else{
						
							echo "Errore, link di attivazione non inviato.";
						
						}
					
					}
				}
				
			}
		
		} else {
			
			$passkey = htmlspecialchars($_GET['passkey']);
			if(preg_match("/^[A-Za-z0-9]$/", $passkey)){ //Controllo se corrisponde
				
				
			$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'"; //Se corrisponde prelevo i dati dal db utenti_temp e li trasferisco al db utenti
			$risultatouser = mysql_query($sqlrecuperauser);
			
			} else {
				
				echo "C'è stato un errore nella registrazione, riprovare o mandare una mail al gruppo.";
				header("Refresh: 2; URL= index.php"); 
				
			} if($risultatouser) {
			
				$contauser = mysql_num_rows($risultatouser);
				
			if($contauser == 1){
				
					$rows = mysql_fetch_array($risultatouser);
					$username = $rows['username'];
					$email = $rows['email'];
					$password = $rows ['password'];
					
					$passwordcript = md5($password);
					
					$sqlconfermauser = mysql_query("INSERT INTO utenti (username, password, email) VALUES ('$username', '$passwordcript', '$email')");
					
					if ($sqlconfermauser) {
					
						echo "Il tuo account è stato attivato con successo";
						$sqleliminadati = mysql_query("DELETE FROM utenti_temp WHERE codiceconferma = '$passkey'");
					
					} else {
					
						echo "Errore!";
					
					}
				
				}
			
			}
			
		}

	?>
	
	
	</div>
	
	
</body>
</html>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
ecco la pag per la registrazione (dovrebbe funziare)
PHP:
<?php
include_once 'header.php';
//$t = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
function ver_testo($t,$mi,$m){
    if(preg_match("/^[A-Za-z0-9]{$mi,$m}$/", $t)){
        //testo ok
        return TRUE;
    }else{
        return FALSE;
    }
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	$username = trim($_POST['username']);
	$password1 = trim($_POST['password1']);
	$password2 = trim($_POST['password2']);
	$email = trim($_POST['email']);
	//metto a vuoto messagggio di errore
	$ok_ko="";
	if(!ver_testo($username,3,8)){$ok_ko.="username non corretto<br />";}
	if(!ver_testo($password1,6,12)){$ok_ko.="prima password non corretta<br />";}
	if(!ver_testo($password2,6,12)){$ok_ko.="seconda password non corretta<br />";}
	if($password1 != $password2){$ok_ko.="le password non coincidono<br />";}
	if(!filter_var($email, FILTER_VALIDATE_EMAIL)){$ok_ko.="indirizzo email non valido<br />";}
	if($ok_ko==""){//se è rimasto vuoto non ci sono errori
    	//qui dovresti mettere i dati di connessione al db *****
		//fai quello che devi fare
		$codiceconferma = md5(uniqid(rand()));
		$username = mysql_real_escape_string(strtolower(($username));//conviene salvarlo tutto in minuscolo
		//e ti conviene verificare che non ce ne sia un altro uguale
		$q=mysql_query("SELECT username FROM utenti WHERE username='$username'");
		if(mysql_num_rows($q)>0){
			//avvisi e torni al form pulito
			echo "ATTENZIONE: username esistente, si prega di cambiarlo<br />"
			echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
		}else{
			$password = mysql_real_escape_string($password1);
			$email = mysql_real_escape_string($email);
			$query="INSERT INTO utenti_temp (codiceconferma, username, password, email) VALUES ('$codiceconferma', '$username', '$password2', '$email')";  
			if(mysql_query($query)){
				//prepari l'email di conferma da inviare
				//anche se sarebbe meglio che tu usassi al posto di mail() la classe phpmailer
				$to=$email;
                $subject="Conferma la Registrazione";
                $header="Da: Amministratore";
                $message="Ecco il tuo codice di attivazione \r\n";
                $message.="Clicca sul link per confermare la registrazione \r\n";
                $message.="<a href=\"http://siti/Biblionet%20test%20MySql/register.php?passkey=$codiceconferma\">clicca qui</a>";
				if(mail($to,$subject,$message,$header)){
					echo "A breve riceverai codice di attivazione per confermare l'iscrizione<br />";
				}else{
					echo "Si è verificato un errore di trasmissione riprova più tardi<br />";
				}
				echo "<meta http-equiv='Refresh' content='3; URL=index.php'>";//o dove vuoi
			}else{
				//avvisi e rimandi a dove vuoi
				echo "ERRORE di comnnesione, ti preghiamo di riprovare più tardi<br />";
				echo "<meta http-equiv='Refresh' content='3; URL=index.php'>";//o dove vuoi
			}
		}
	}else{
		//avviso degli errori
		echo $ok_ko;
		//e dipo 3 secondi torno automaticamente al form ripulito
		echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
		//i secondi di attesa possono essere aumentati o diminuiti
	}
}
?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" id="formregistrazione">
	<table class="pinco_pallo">          
		<tr>
			<td><label for="username">Username</label></td>
			<td><input type="text" name="username" id="username" /></td>
		</tr>
		<tr>
			<td><label for="password1">Password</label></td>
			<td><input type="password" name="password1" id="password1" />
		</tr>
		<tr>
			<td><label for="password2">Ripeti Password</label></td>
			<td><input type="password" name="password2" id="password2" /></td>
		</tr>
		<tr>
			<td><label for="email">Email</label></td>
			<td><input type="text" name="email" id="email" /></td>
		</tr>
		<tr>
			<td>&nbsp;</td><td><input type="submit" name="invia" id="registrati" value="Registrati" /></td>
		</tr>
		<tr>
			<!--qui ci sta bene un link in modo che l'utente possa uscire senza registrarsi -->
			<td>&nbsp;</td><td><a href="index.php">esci</a></td>
		</tr>
	</table> 
</form>

poi devi farti la pagina per accettare la conferma, ma per quella fai un altrp post

p.s.
ho tolto ul e li e messo table perchè secondo me form più ordinato
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
dovresti dirmi queli sono le righe (comunque guarda quello che ti ho postato)
poi secondo me non dovresti impedire di avere due email uguali (es io e mia moglie ne abbiamo una unica quindi es. o si iscrive lei o mi iscrivo io).
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Eccomi, sono di nuovo me, ti allego i lcodice mi puoi dire se è ok?
PHP:
<?php
include_once 'header.php';
//$testo = testo da verificare, $mi= lunghezza minima del testo, $ma= lunghezza massima
function ver_testo($testo,$mi,$ma){
    if(preg_match('/^[A-Za-z0-9]{$mi,$ma}$/', $testo)){
        //testo ok
        return TRUE;
    }else{
        return FALSE;
    }
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $username = trim($_POST['username']);
    $password1 = trim($_POST['password1']);
    $password2 = trim($_POST['password2']);
    $email = trim($_POST['email']);
    //metto a vuoto messagggio di errore
    $ok_ko="";
    if(!ver_testo($username,4,10)){$ok_ko.="username non corretto deve essere lungo da 4 a 10 caratteri <br />";}
    if(!ver_testo($password1,6,12)){$ok_ko.="prima password non corretta deve essere composta da minimo 6 massimo 12 caratteri<br />";}
    if(!ver_testo($password2,6,12)){$ok_ko.="seconda password non corretta deve essere composta da minimo 6 massimo 12 caratteri<br />";}
    if($password1 != $password2){$ok_ko.="le password non coincidono<br />";}
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){$ok_ko.="Attenzione!, indirizzo email non valido<br />";}
    if($ok_ko==""){//se è rimasto vuoto non ci sono errori

		$codiceconferma = md5(uniqid(rand()));
        $username = mysql_real_escape_string(strtolower(($username)));//conviene salvarlo tutto in minuscolo
        //e ti conviene verificare che non ce ne sia un altro uguale
        $verificauseremail=mysql_query("SELECT id FROM utenti WHERE username='$username' OR email='$email'");
        if(mysql_num_rows($verificauseremail)>0){
            //avvisi e torni al form pulito
            echo "ATTENZIONE: username o email già esistente, scegline un altro.<br />";
            echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
        }else{
            $username = mysql_real_escape_string($username);
        	$email = mysql_real_escape_string($email);
			$password = mysql_real_escape_string($password1);
            $inviautentitemp = "INSERT INTO utenti_temp (codiceconferma, username, password, email) VALUES ('$codiceconferma', '$username', '$password2', '$email')";
			if(mysql_query($inviautentitemp)){

				//prepari l'email di conferma da inviare
                //anche se sarebbe meglio che tu usassi al posto di mail() la classe phpmailer

            	//Includo la classe phpmailer
            	include_once ('class.phpmailer.php');

            	$mail = new PHPmailer();
            	$mail->IsSMTP();
            	$mail->SMTPDebug = true;

            	//Dati di collegamento al server che su aruba non servono

            	$mail->Host = "smtp.sito.it";
            	$mail->Port = 25;

            	$mail->SMTPAuth = true;
            	$mail->Username = "[email protected]";
            	$mail->Password = "psw";

            	// Impostazioni invio mail al cliente

				$mail->Setfrom ("[email protected]","Sito");		//Inserire la mail dell'amministratore ed il nome del sito
				$mail->AddReplyTo("[email protected]","Amministratore");
            	$mail->AddAddress ($email); //Mail che riceverà chi si iscrive
				$mail->MsgHTML("<html><head></head><body>Questa è una email in <b>Html</b></body></html>");
				$mail->AltBody = "Questa mail non è in HTML";
            	$mail->Subject = ("Conferma di registrazione al sito www.sito.com");
            	$mail->Body = "Ecco il tuo codice di attivazione \r\n";
            	$mail->Body .= "Clicca sul link per confermare la registrazione \r\n";
            	$mail->Body .= "<a href=\"http://siti/Biblionet%20test%20MySql/register.php?passkey=$codiceconferma\">clicca qui</a>;

                if ($mail->Send()){
                    echo "Tra poco riceverai codice di attivazione per confermare l'iscrizione";
                }else{
                    echo "Si è verificato un errore di trasmissione riprova più tardi";
                	//e dopo 3 secondi torno automaticamente al form ripulito
                	echo "<meta http-equiv='Refresh' content='3; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
                	//i secondi di attesa possono essere aumentati o diminuiti
           		}
			}


		} else {
			echo "ERRORE di comnnesione, ti preghiamo di riprovare più tardi<br />";
			echo "<meta http-equiv='Refresh' content='3; URL=index.php'>";

		}
    }
}
?>
                <form method="post" id="formregistrazione" form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
                    <table class="pinco_pallo">
                        <tr>
                            <td><label for="username">Username</label></td>
                            <td><input type="text" name="username" id="username" /></td>
                        </tr>
                        <tr>
                            <td><label for="password1">Password</label></td>
                            <td><input type="password" name="password1" id="password1" />
                        </tr>
                        <tr>
                            <td><label for="password2">Ripeti Password</label></td>
                            <td><input type="password" name="password2" id="password2" /></td>
                        </tr>
                        <tr>
                            <td><label for="email">Email</label></td>
                            <td><input type="text" name="email" id="email" /></td>
                        </tr>
                        <tr>
                            <td>&nbsp;</td><td><input type="submit" name="invia" id="registrati" value="Registrati" /></td>
                        </tr>
                        <tr>
                            <!--qui ci sta bene un link in modo che l'utente possa uscire senza registrarsi -->
                            <td>&nbsp;</td><td><a href="index.php">esci</a></td>
                        </tr>
                    </table>
               </form>

cioè qui

Grazie
 
Ultima modifica:

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Perdona i doppio post ma non ho fatto in tempo amodificarlo. Ho questo eerore
PHP:
syntax error, unexpected 'post' (T_STRING)

su questa riga
PHP:
               <form method="post" id="formregistrazione" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>">

che fò?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
attento
qui non hai chiuso "
$mail->Body .= "<a href=\"http://siti/Biblionet%20test%20MySql/register.php?passkey=$codiceconferma\">clicca qui</a>";

poi sulla riga manca il ; finale
<form method="post" id="formregistrazione" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">

se vuoi inviare in html e mi sembra di si anche perchè invii il link, manca
$mail->IsHTML(true); // invio l'email in formato HTML
e in remoto toglierei tutta la parte relativa all'smtp e aggiungerei in ccn (nascosto) il tuo indirizzo così ti arriva in copia e sai se qualcuno e chi si sta iscrivento
PHP:
<?php
include_once ('class.phpmailer.php');
                $mail = new PHPmailer();
                //$mail->IsSMTP();
                //$mail->SMTPDebug = true;
				$mail->IsHTML(true); // invio l'email in formato HTML
                //Dati di collegamento al server che su aruba non servono
                //$mail->Host = "smtp.sito.it";
                //$mail->Port = 25;

                //$mail->SMTPAuth = true;
                //$mail->Username = "[email protected]";
				//ecc.......
				$mail->AddAddress ($email); //Mail che riceverà chi si iscrive
				$mail->AddBCC("[email protected]")//per ricevere in copia metti il tuo indirizzo
				//.......
?>
la parte smtp usala solo per far le prove in locale
poi migliorerei il testo alternativo altrimenti l'utente può non capire
PHP:
//....
$mail->AltBody = "il tuo client di posta non è settato per la ricezione in HTML/n
modificalo o scrivi all'amministratore [email][email protected][/email]/n";
//eventualmente aggiungi anche il codice di attivazione
//....
poi gli indicherai tu cosa fare per farsi attivare

poi per il resto mi sembra ok, comunque fai delle prove con iscrizioni fittizie
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Intanto mille grazie. :eek::eek:
Allora non ho la necessità di ricevere la mail con chi si sta registrando.
Posso inserire alla voce AltBody solo il testo della mail senza l'impaginazione di un html? Cioè inviare soltanto "grazie per la registrazione clicca qua per attivarti"?
Ho corretto i due piccoli errorini ma adesso mi dice che la fine del form non è corretta, o meglio
PHP:
 syntax error, unexpected end of file
questo alla riga finale.
Per la configurazione smtp, naturalmente primo farò le prove in locale poi sul server vero.

Grazie
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
ho/hai dimenticato probabilmente di chiudere qualche graffa di qualche if/else, verifica.
se invii solo in formato testo l'utente vede nell'email (scrivo staccato affinche non si formi ol link)
...
<a href="http: // siti/Biblionet%20test%20MySql / register.php ? passkey=abcdefghilmnopqrs">clicca qui</a>
....
mentre se invii in formato html l'utente vede

.....
clicca qui
.....
e passando sopra il link (dovresti saperlo) nel bw vedrà
http: // siti/Biblionet%20test%20MySql / register.php ? passkey=abcdefghilmnopqrs

poi nel testo per html metti <br> o il tag <p>...</p> non /n/r
 
Discussioni simili
Autore Titolo Forum Risposte Data
xone [Offro] Correzione e miglioramento SEO di qualsiasi tipologia di sito Offerte e Richieste di Lavoro e/o Collaborazione 2
TheGamer [offro] Creazione e miglioramento sito Wordpress, prezzi modici! Offerte e Richieste di Lavoro e/o Collaborazione 0
braccobaldo Aumento follower su Twitter = miglioramento del posizionamento? SEO e Posizionamento 7
promuovimi [Vendo] Incremento followers Google PLUS (+1, cerchie) per miglioramento SEO Annunci servizi di Social Media Marketing 0
Sevenjeak Aiuto miglioramento funzione per inserimento BBCode in textarea Javascript 1
B funzione .nl2br e miglioramento script PHP 1
K allineare controlli in un div HTML e CSS 3
M Effettuare i controlli di obbligatorietà lato server e, per quanto possibile, di tipo. PHP 0
M Controlli array PHP 0
H Controlli form jQuery 0
H [risolto] Controlli form iscrizione PHP 16
X Errore nei controlli! PHP 5
F Controlli form per Registrazione utenti PHP 9
M Problema controlli MySQL ( XOR ) MySQL 1
S Controlli variabili php PHP 11
Emix Momento di lapsus... Controlli su user e pwd e campo booleano... PHP 5
O Controlli come parametri Javascript 3
S Eseguire controlli sul form delle foto PHP 17
P far sparire un tasto con i controlli PHP 1
T come mettere controlli su form di inserimento dati?? PHP 11
C controlli sulle registrazioni Sicurezza e Virus 0
Z problema con i controlli disattivati su IE 7 Javascript 2
M controlli radio button Javascript 2
E controlli su tabelle statiche Classic ASP 1
F me lo controlli per favore? PHP 0
Q VB6 Caricamento spezzettato matrici di controlli Programmazione 0
A controlli js Javascript 1
S Licenze?? controlli?? Flash 1
H controlli per la data Javascript 1
G Input checkbox in CSS HTML e CSS 0
L Ripetere Campi disabilitando input in riferimento ad un valore della select jQuery 0
otto9due Input text: accetta solo numeri e non può essere vuoto. Javascript 9
M Come recuperare molteplici input form PHP 1
F Lettura "input number" dinamico PHP 4
B form gestione input PHP 2
M Creare un campo input select quantità di un numero intero prelevato dal db PHP 3
F Leggere e aggiornare dati di campi <input text> su file di test PHP 0
R Nome input testo+variabile PHP 1
L input (rilevare cambio dati) PHP 3
S riflettere valore di campo input range in live Javascript 0
L input dati con inser into select ? PHP 4
M Compilazione automatica campi in input stessa pagina PHP 0
A attributo "min" per input gestione date PHP 8
F Steps campo input field Javascript 1
C input in sostituzione della select PHP 2
C [RISOLTO]Inserimento variabile php in input html PHP 20
L input (controllo se è stato modificato o no). PHP 1
W Modificare il Type di un Input box in javascript ovunque si trovi Javascript 0
S [PHP] Recupero nome immagine da Form con input file PHP 3
T [PHP] Autocompilazione input multiple da una select PHP 1

Discussioni simili