giovedì 15 novembre 2012

Creare un login sicuro con PHP e MySQL pt. 4/4

Cari lettori, benvenuti nella quarta ed ultima parte di questo articolo. Vi ricordo che potete trovare la precedente parte del tutorial a questo indirizzo e, inoltre, ribadisco per l'ennesima volta il nostro intento: Il tema centrale del tutorial proposto non è tanto la grafica, che potrete ovviamente modificare e personalizzare a vostro piacimento, ma la sicurezza! Vedremo, infatti, i migliori metodi per criptare le password, per resistere ai brute force e per difenderci dalle SQL injection. In quest'ultima parte, a fine articolo, troverete il codice sorgente intero!

Il Javascript

La prima cosa sulla quale ci viene in aiuto il JavaScript è la criptazione della password. Implementeremo, infatti, l'algoritmo di hash denominato sha512 per inviare le password tra il client ed il server in maniera non leggibile. L'algoritmo sha512 può essere liberamente scaricato da pajhome.org.uk

Completato questo passaggio possiamo proseguire creando il file form.js che conterrà il seguente codice:
function formhash(form, password) {
   var p = document.createElement("input");
   form.appendChild(p);
   p.name = "p";
   p.type = "hidden"
   p.value = hex_sha512(password.value);
   password.value = "";
   form.submit();
}

L'HTML 


Tutto ciò che dobbiamo creare in HTML è un modulo con due campi di testo, denominati rispettivamente "e-mail" e "password". Il Javascript creato poc'anzi andrà, quindi, a generare un hash della password inserita nell'apposito campo.
<script type="text/javascript" src="sha512.js"></pre>
<script src="forms.js" type="text/javascript"></script>
<form action="process_login.php" method="post" name="login_form">
Email: <input name="email" type="text" /><br />
Password: <input id="password" name="password" type="password" /><br />
<input onclick="formhash(this.form, this.form.password);" type="button" value="Login" />

Proteggere le pagine private


L'ultimo, ma fondamentale, passaggio che rimane è controllare se l'utente è autenticato prima di accedere ad ogni pagina privata. Il seguente codice PHP, infatti, andrà inserito in ogni pagina che desiderate rendere privata
// N.B. i file da includere come functions.php e connects_db.php vanno qui!
sec_session_start();
if(login_check($mysqli) == true) {
 
   // Qui va in inserito l'intero contenuto della tua pagina protetta
 
} else {
   echo 'Spiacente, ma non sei autorizzato a visionare il contenuto di questa pagina. 
';
}

CONCLUSIONI E SORGENTI 

Prima di decretare questo articolo ufficialmente chiuso vi lascio alcune importanti considerazioni:
  • Non utilizzare mai il metodo di crittografia md5. È considerato ufficialmente non sicuro. Per maggiori informazioni vedi su wikipedia.
  • Potete ovviamente personalizzare il form di login in HTML con le dovute classi CSS
  • Potete adattare, con pochi accorgimenti, questo script ad altri tipi di database quali SQLite e PostgreSQL
Come al solito, per qualsiasi incomprensione o dubbio potete commentare questo articolo o inviarmi un email a noframe@lucapipolo.it. Infine potete effettuare da qui il download completo di tutto il codice sorgente!

9 commenti:

  1. Non funziona! bella roba...

    RispondiElimina
  2. Sei la prima persona (delle tante che mi hanno contattato via mail) a cui non funziona.
    Se magari riesci ad essere più preciso e mi spieghi COSA non funziona, posso esserti d'aiuto.

    RispondiElimina
  3. Ciao. A me fornisce questo messaggio successivamente alla login: Richiesta non valida!
    Riferisce al file process_login.php ... non riesco a capire di che variabile si tratta.

    RispondiElimina
  4. Ciao. Potresti spiegarmi come farla funzionare?

    RispondiElimina
  5. Ciao,
    il download non è più disponibile.
    Mi sono creato i vari file .php, .js, ecc, ho provato a creare una pagina html con i 2 campi di testo da te indicato, ma quando clicco su login, non fa assolutamente niente.
    Sapresti aiutarmi? grazie ciao.

    RispondiElimina
  6. Ottimo articolo, grazie, funziona alla perfezione. Solo una curiosità: da quello che leggo (confermo che il download non è più disponibile) faccio fatica a capire l'utilità della funzione formhash (a parte il fatto che svuota il campo password); infatti riempie solo un campo hidden con la password criptata, ma il submit della form invia la password in chiaro (che infatti viene criptata insieme al salt nella funzione php login). Mi è sfuggito qualcosa?
    Grazie ancora.

    RispondiElimina
  7. quoto anche a me quando clicco login non fa niente,

    in tutte le pagine comprese functions etc inizio con
    tranne i javascript che inizio con script language="JavaScript" e finisce con /script

    corretto?

    RispondiElimina
  8. perdonami e ho anche messo il true perchè uso https

    RispondiElimina
  9. salve, non riesco a trovare nel forum una guida per la registrazione dell'utente registrando come con i campi del login, cioe con sha512 e salt, potrebbe cortesemnte darmi un aiuto, grazie ;)

    RispondiElimina