registrazione sicura

  • Creatore Discussione Creatore Discussione ispanic
  • Data di inizio Data di inizio

ispanic

Utente Attivo
28 Ago 2014
119
0
0
Ciao ragazzi, ho creato una registrazione standard, che legge vari form e se sono giusti li spedisce in una tabella del database mentre se sono sbagliati la pagina visualizzerà un messaggio di errore, però girando sul web ho visto che potrei mettere varie sicurezze alla registrazione...
Quali sono i frammenti di codice in più da mettere per renderla sicura e cosa si rischia non rendendola?
 
Ciao,
per la sicurezza sull'acceso devi criptare la password utente, in modo che la password reale non sia visibile in db.
Quindi devi fare la cifratura in md5 o meglio in sha1.
In genere non è mai una buona idea memorizzare le password degli utenti nel database senza cifrarle. Il motivo principale di questo è che qualcuno può avere accesso al database, anche soltanto in modalità di sola lettura... Quindi può fare accesso e tentare accesso anche in altri siti con le stesse credenziali... puoi immaginare il resto...
Per cifrare la pws è semplice:
Codice:
$pws_cifrata=sha1($pws_utente);
 
Io ti consiglio di usare sha1 ma non una, tre o quattro volte.
Es $pass=sha1(sha1(sha1($password)));
Esistono database di password in sha1 e se la password é semplice é facile da recitare e dato che gli utenti odiano password difficili per tutelarli veramente usa questo metodo.
Oppure puoi fare un misto tra sha1 e md5. Scegli tu... Ma una volta sola sia per sha1 che per md5 é rischioso.

Inviato con Tapatalk Free da Android
 
mmm grazie mille! Ma non è facile decriptarle con un decriptatore apposta?
Altre due cose: Se una perosna riesce ad avere la sola lettura del database, potrebbe entrare nel profilo dell'utente copiando e incollando il codice sha1 nel form?
Inoltre cripto solo le password o anche qualcos'altro? Come è più utile?
 
Se usi un metodo una sola volta si. Se lo usi più volte o fai un mix tra vari metodi diventa impossibile. E questo é quello che devi ottenere per dare sicurezza a te e ai tuoi utenti nel caso riescano a leggerti il database.

Inviato con Tapatalk Free da Android
 
perfetto grazie mille, ma se io provo ad entrare nel form di registrazione con la password criptata? questa entra?
 
Cioè, io cripto la password che si trova nel db con sha1(), se un utente melintenzioanto entra nel database e incolla la password criptata sul form "password" non riuscirà lo stesso ad entrare?
 
No. Ma se incolla si google ed é una password poco criptata su google troverà la decriptazione, quindi potrà entrare

Inviato con Tapatalk Free da Android
 
grazie mille, ma scusami perché no? se io entro in un databse dove le password sono criptate, e prendo il nome utente e incollo la password criptata nel login, perché non dovrebbe entrare?
 
Perché tu al login devi controllare la password che coincida. Per controlarla devi criptare l'input dell'utente e controllare che coincida con quella salvata (criptata). Se uno inserisce quella già criptata ricriptandola cambierà

Inviato con Tapatalk Free da Android
 
Ciao,
sha1 ed md5 non sono considerati abbastanza sicuri.
Infatti, è possibile risalire alla password originale utilizzando la cosiddetta "forza bruta". È vero che se utilizzi più volte le due funzioni, magari alternandole, i potenziali hackers dovranno anche trovare la giusta combinazione, ma io ti consiglierei di utilizzare anche password_hash e/o crypt().
Ecco un esempio di implementazione.
PHP:
<?php
function hasha($passwordoriginale){
$crypt = md5(sha1(md5(md5(sha1($passwordoriginale)))));
$caratteri_disponibili ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
$lunghezza= 22;
$salt = "";
for($i = 0; $i<$lunghezza; $i++){
$salt = $salt.substr($caratteri_disponibili,rand(0,strlen($caratteri_disponibili)-1),1);
}
$newsalt= '$2a$07$'.$salt.'$';
$hashed_password = crypt($crypt,$newsalt); 
return $hashed_password;
}
$passworddacrittare = "password";
$passwordcrittata = hasha($passworddacrittare);
?>
Demo

Per il confronto, utilizzerei hash_equals, oppure, se usi una versione di php precedente alla 5.6,
PHP:
if(crypt($passworddacrittare, $passwordcrittata) == $passwordcrittata){echo 'Le password coincidono';}
else{echo 'Le password non coincidono';}

Inoltre, dovresti anche impedire agli utenti di scegliere password poco sicure in fase di registrazione. Ad esempio, potresti stabilire questi criteri:
-Più lunga di 8 caratteri;
-Contenente almeno una lettera minuscola, un numero ed una lettera maiuscola;
-Non contenente il nome utente/l'indirizzo email/altre informazioni salvate in fase di registrazione;
-Non contenente la parola "password";

Infine, ti consiglio di impostare alcuni controlli per evitare che vengano utilizzati sistemi automatici per scoprire la password:
-Se in fase di login viene inserita una password errata per 3 volte, richiedi di riportare un codice captcha (puoi usare recaptcha), oppure un'altro metodo verifica simile (ne esistono diversi, tutti basati su azioni che i bot non possono compiere, ma gli umani sì).
-Se in fase di login viene inserita una password errata per 10 volte, blocca l'accesso al dispositivo (utilizzando i cookies) per 5 minuti, facendo ricominciare il timer se la pagina viene aggiornata.
-Se vengono effettuati 10 tentativi di accesso falliti per un utente specifico, blocca l'accesso (per ogni terminale) all'account dell'utente per alcuni minuti.
 

Discussioni simili