ATTENZIONE!!!Codice PHP:$passkey = $_GET['passkey'];
$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'";
Secondo me si fa una SQL injection in 2 secondi...


Ho creato un form molto leggero e giusto di prova per poi migliorarlo. di seguito il codice.ed il file della pagina di loginCodice 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>Come potrei migliorarlo? Come potrei migliorare il controllo su gli input dopo il suggerimento di borgo italia ?Codice 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>
Grazie e tutti
ATTENZIONE!!!Codice PHP:$passkey = $_GET['passkey'];
$sqlrecuperauser = "SELECT * FROM utenti_temp WHERE codiceconferma = '$passkey'";
Secondo me si fa una SQL injection in 2 secondi...
Ultima modifica di f107; 09-08-2012 alle 02:24
http://www.linkedin.com/pub/matteo-barison/53/289/831 :: http://smarriti.org
http://link2me.it/network/7172/matteo-barison/index.htm :: http://infinitymetin.net
ciao
intanto per la passkey
sistema più semplice:
oppure dato che è mdcinquata quindi dovrebbe essere solo caratteri asci alfanumericiCodice PHP:<?php
//..........
} else {
$passkey = htmlspecialchars($_GET['passkey']);
//...eccetera
?>
Codice 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
?>


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 responsabilequello 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.Codice 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);
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
ciao
se è negativo vuol dire che qualcuno ha cercato di accedere fraudolentemente, quindi metti un riinvio immediato e automatico ad una pagina (es alla home)è che cosa dovrebbe succedere nel caso la funzione preg_match non dia esito positivo
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
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'èCodice 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");
}
?>


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.![]()


Ma le cariabili $t, $mi, $m non devo dichiararle?
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;
}
}
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)


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?
Il file jS è questoCodice 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;
}
Codice 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"
},
},
});
})
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