Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-10-2009, 21:02   #1
Fede 88
Senior Member
 
L'Avatar di Fede 88
 
Iscritto dal: Aug 2004
Città: Milano
Messaggi: 1310
[PHP] Problema con conferma registrazione

Ho creato la parte della mail di conferma per la registrazione al mio sito internet, che funziona nel seguente modo:

Dopo aver controllato tutti i dati ed averli inseriti nel database creo un numero ad 8 cifre (random) e lo salvo in un campo [codice] nella tupla dell'account appena creato. A questo punto invio una mail con il link alla pagina "attivazione.php" con accodato il suddetto codice tramite metodo GET.
L'utete cliccando sul link attiva l'account.

Inizialmente sembrava funzionare alla perfezione, però provando a sostituire il codice ricevuto via mail con altri codici scritti, diciamo a caso, mi sono accorto che veniva visualizzato comunque account attivato.

Questo è il codice:
Codice:
<?php

include("connessioneDB.php");

$code = $_GET['code'];

if (!$code) { echo "ERRORE: Codice di attivazione non fornito!"; }
  else 
    {
      // Seleziono tutte le tuple che hanno codice uguale al codice ricevuto tramite
      // metodo GET e campo conf=1, ovvero che sono già stati attivati
      $check = mysql_query("SELECT * FROM utenti WHERE codice='$code' AND conf='1'");
      // Seleziono username e password degli utenti con il suddetto codice
      $username = mysql_query("SELECT username FROM utenti WHERE codice='$code'");
      $password = mysql_query("SELECT password FROM utenti WHERE codice='$code'");
      // creo una sessione con i selezionati dal DB
      session_start ();
      $_SESSION['username'] = $username;
      $_SESSION['pass'] = $password;

      
      if(mysql_num_rows($check)==1) { echo "Il tuo account è già stato attivato!"; }
        else
          {
   	    // Attivo l'account settando il campo conf a 1
            $activate = mysql_query("UPDATE utenti SET conf='1' WHERE codice='$code'");
  	    echo "Il tuo account è stato attivato!";   
          }

    }
Qualcuno sa dirmi il perchè?
Fede 88 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2009, 22:45   #2
kurts
Senior Member
 
L'Avatar di kurts
 
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
dunque, prima di tutto un consiglio:
scrivendo
Codice:
$code = $_GET['code'];
tu dai per scontato che la variabile "code" esista ed abbia un valore assegnato, sarebbe meglio una cosa del genere:
Codice:
if(IsSet($_GET['code'])){
  $code = $_GET['code'];
}
else{
//qui ti gestisci il caso in cui non ci sia un valore
}
per quanto riguarda la query dovrebbe essere questa: (occhio alle virgolette ed al punto per la concatenazione)
Codice:
$check = mysql_query("SELECT * FROM utenti WHERE codice='".$code."' AND conf='1'");
se non ho capito male il campo conf è un boolean che vale 1 se l'account è attivo, a questo punto mi chiedo, non sarebbe meglio eseguire la query tralasciando per il momento il campo conf per controllarlo in seguito?
così facendo eviti di eseguire le gue query successive, che puoi comunque eseguire in una volta sola.

per quanto riguarda la password io ti consigliere di evitare di memorizzarla, la controlli una sola volta, al momento del login, magari confrontando gli hash MD5 così eviti di trasmetterla in chiaro.
inoltre ora tu non controlli che io conosca effettivamente il nome utente e la password relative al codice immesso, li vai semplicemente a recuperare da DB.

in conclusione io scriverei uno script del genere:
Codice:
<?php
include("connessioneDB.php");

if(!IsSet($_GET['code'])){
	echo "ERRORE: Codice di attivazione non fornito!"; }
}
else{
	$code = $_GET['code'];
	$check = mysql_query("SELECT * FROM utenti WHERE codice='".$code."'");
	$curruser=mysql_fetch_array($check);
	if($curruser['conf']=='1'){
		echo "Il tuo account è già stato attivato!";
	}
	else{
		$activate = mysql_query("UPDATE utenti SET conf='1' WHERE codice='".$code."'");
		echo "Il tuo account è stato attivato!";  
	}
}
?>
ho dato per scontato che il codice di attivazione sia generato in modo da non averne mai 2 uguali tra loro

ho buttato giu il codice al momento, quindi attendo tue notizie sull'eventuale presenza di errori.

---------

gia che ci sono colgo l'occasione per presentarmi:
ciao a tutti, mi chiamo giacomo, ho 23 anni, vivo in provincia di varese, sono studente in scienze e tecnologie dell'informazione presso l'università degli studi dell'insubria di como dove sto per laurearmi.

complimenti per il forum ed anche a tutti gli utenti che lo popolano, continuate così.
kurts è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 01:08   #3
Luca 88
Senior Member
 
Iscritto dal: Aug 2004
Città: Milano Provincia
Messaggi: 376
ciao, innanzitutto benvenuto! io stò facendo il sito con il mio amico che ha postato il problema....

ho provato a fare come consigliato da te... e funziona come funzionava il nostro... cioè lo attiva ma se nella barra metti un qualsiasi numero ti dice: "Il tuo account è stato attivato!"

ora... magari il problema non è in quel file .php... ma nella registrazione... ti posto il codice del file registra.php inerente all'attivazione:

Codice:
            $codice = rand(11111111,99999999);
            $to = $email;
            $subject = "Attiva il tuo account";
            $headers = "From: [email protected]";
            $body = "Ciao $username, \n\nTi sei registrato e devi fare l'attivazione. Clikka il link sotto per attivare il tuo account\n\nhttp://127.0.0.1/cartellasito/attivazione.php?codice=$codice\n\nGrazie!";

   //controllo il funzionamento della mail
   if (!mail($to,$subject, $body, $headers)) {echo "non funziona la mail";}
     else {
                              // Salvo i dati del nuovo utente nel database
                              mysql_query("INSERT INTO utenti (email, username, password, nascita , sesso, codice, data_reg) VALUES ('$email', '$username',  '".md5($pass)."', DATE('$anno/$mese/$giorno') , '$sesso', '$codice', NOW())") or die (mysql_error());
                              echo "Registrazione avvenuta con successo! attiva l'accaunt con la mail che ti arriva a ($email)";
ovviamente nelle righe precedenti c'erano dei controlli per vedere delle cose... e se tutto è ok allora ti allora ti appare questa cosa: "Registrazione avvenuta con successo! attiva l'accaunt con la mail che ti arriva a ($email)";

va tutto perfettamente... ma come detto prima con qualsiasi numero si metta ti dice account attivato...
Luca 88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 09:53   #4
Fede 88
Senior Member
 
L'Avatar di Fede 88
 
Iscritto dal: Aug 2004
Città: Milano
Messaggi: 1310
Grazie per la risposta, ho provato e funziona, l'unico problema è che sostituendo il codice con altre cifre casuali, visualizza la stringa: "il tuo account è stato attivato", perchè se non trova nessun account corrispondente a quel codice ovviamente il campo con sarà diverso da 1.

Quindi penso che per risolvere basti aggiungere un controllo per vedere se la select ha ottenuto risultati.
Fede 88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 10:03   #5
Fede 88
Senior Member
 
L'Avatar di Fede 88
 
Iscritto dal: Aug 2004
Città: Milano
Messaggi: 1310
Sistemato in questo modo:

Codice:
<?php

include("connessioneDB.php");

// Controllo che la variabile "codice" ricevuta tramite GET abbia un valore 
if(!IsSet($_GET['codice'])){ echo "ERRORE: Codice di attivazione non fornito!";}
  else
    {
      $codice = $_GET['codice'];
      $check = mysql_query("SELECT * FROM utenti WHERE codice='".$codice."'");
      $appo = mysql_num_rows($check);
      if ($appo != 1) { echo "Non corrisponde nessun account al codice di attivazione usato"; }
        else 
          {
            $curruser=mysql_fetch_array($check);
            if($curruser['conf']=='1') { echo "Il tuo account è già stato attivato!"; }
	      else
                {
	          $activate = mysql_query("UPDATE utenti SET conf='1' WHERE codice='".$codice."'");
	          echo "Il tuo account è stato attivato!";  
	        }
          }

    }

?>
Fede 88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 12:41   #6
kurts
Senior Member
 
L'Avatar di kurts
 
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
Quote:
Originariamente inviato da Fede 88 Guarda i messaggi
se non trova nessun account corrispondente a quel codice ovviamente il campo con sarà diverso da 1.
gia gia, hai ragione, me ne ero proprio dimenticato!
ora funziona tutto come si deve?
mi permetto di darvi un altro consiglio:
voi usate la funzione "rand()" per generare un numero compreso tra 11111111 e 99999999, ora, il mio consiglio è, se non avete assolutamente bisogno di avere un numero intero come codice di attivazione, di usare qualcosa come
Codice:
$code=time().$username;
MD5($code);
perchè?
-rand() potrebbe generare codici di attivazioni uguali per più utenti;
-col timestamp siamo abbastanza sicuri che 2 utenti non ricevano lo stesso codice
-per sicurezza ci concateniamo l'username che è unico
-alla fine criptiamo il tutto in MD5 così da non visualizzare l'username

chiaramente sono solo dei consigli che vi do senza sapere quali sono le esatte specifiche del vostro progetto quindi vedete voi se a accettarli o no.

P.S.: grazie per il benvenuto!
kurts è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 13:12   #7
Fede 88
Senior Member
 
L'Avatar di Fede 88
 
Iscritto dal: Aug 2004
Città: Milano
Messaggi: 1310
Quindi in pratica alla fine accodiamo una stringa di 32 caratteri alfanumerici, giusto?

Mi sembra una buona idea.

Poi ho anche aggiunto un altra modifica, quando l'account è attivato il campo codice viene svuotato.
Fede 88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 13:42   #8
kurts
Senior Member
 
L'Avatar di kurts
 
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
Quote:
Originariamente inviato da Fede 88 Guarda i messaggi
Quindi in pratica alla fine accodiamo una stringa di 32 caratteri alfanumerici, giusto?
coi 32 caratteri ti riferisci all'hash md5? si, lo puoi usare al posto della funzione rand() ma non sei obbligato, potresti benissimo usare anche solamente questo:
Codice:
MD5($username)
io ho aggiunto anche il time() così da aumentare il grado di "casualità" del codice.
chiaramente tu puoi implementare la tua funzione personale di generazione del codice.

Quote:
Originariamente inviato da Fede 88 Guarda i messaggi
Poi ho anche aggiunto un altra modifica, quando l'account è attivato il campo codice viene svuotato.
questa è una buona idea, anche se generalmente si preferisce non lasciare mai dei campi vuoti all'interno di un DB se non è proprio necessario.
un'altra miglioria che potresti apportare è aggiungere il LIMIT=1 così da far fermare la query al primo risultato trovato evitanto sprechi di tempo e soprattutto di traffico
kurts è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 14:00   #9
Luca 88
Senior Member
 
Iscritto dal: Aug 2004
Città: Milano Provincia
Messaggi: 376
grazie kurts... non è facile trovare persone che ti aiutino in questa maniera...

comunque... non centra con questa discussone... ma noi dobbiamo ancora rendere "sicura" la nostra registrazione... inserendo dei controlli che impeniscano di "impallarci" il sito... tu sai qualcosa riguardo a questa cosa? quali sono i controlli principali da mettere?

grazie ancora!
Luca 88 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2009, 14:50   #10
kurts
Senior Member
 
L'Avatar di kurts
 
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
forse io non sono la persona più indicata per questo genere di argomento comunque qualche dritta te la posso sempre dare.

-non trasmettere mai dati sensibili in chiaro, ad esempio invece di lavorare sulle pwd usa i loro hash md5.
-quando tratti dei dati presi da campi di input filtrali sempre, in questo modo eviti che vengano visualizzati dei messaggi di warning (innocui ma fastidiosi) in caso di campi vuoti e soprattutto ti proteggi da eventuali tentativi di code injection (decisamente fastidiosi). lo stesso vale per l'upload di file, filtra sempre le estensioni.
-se ti aspetti un dato numerico allora potresti effettuare un cast del tipo in modo da forzarlo ad assumere comunque un valore numerico (stessa cosa per gli altri tipi di dato).
-potresti aggiungere un captcha al form di registrazione oltre che all'ativazione via mail.

che altro?
ora come ora non mi viene in mente niente, comunque ti consiglio di leggerti qualche guida in materia e magari qualche video tutorial che, secondo me, aiutano sempre a capire quello che si sta studiando
kurts è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
NVIDIA RTX PRO 4500 Server Edition: la s...
Core Ultra 200 HX Plus: Intel mette il t...
Starfield arriva su PS5: data ufficiale,...
iPad Air 13" (M4) scende di prezzo: -100...
Oracle annuncia Java 26 con il Java Veri...
OPPO Find N6 è ufficiale: sottile...
Influencer sotto controllo Agcom: arriva...
Scontro in OpenAI sul ChatGPT per adulti...
Apple Watch Series 11 a 349€ e altri int...
Starlink rinnova i piani residenziali in...
POCO X8 Pro e Pro Max ufficiali: potenza...
Jensen Huang propone i token come nuovo ...
Realme 16 Pro e 16 Pro+ tra i più...
Dall'enciclopedia all'algoritmo: Encyclo...
Il CEO di Epic Games Tim Sweeney ha comp...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v