Script login utente in php e mysql sicuro



Похожие документы
Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

DA IPSOA LA SOLUZIONE PER COSTRUIRE E GESTIRE IL SITO DELLO STUDIO PROFESSIONALE!

COOKIES COSA SONO I COOKIES? COME UTILIZZIAMO I COOKIES?

Marketing di Successo per Operatori Olistici

Joomla: Come installarlo e come usarlo. A cura di

Wiki di Netapprendere

INSTALLAZIONE JOOMLA

Guida all uso della piattaforma. portale Weblog & Podcast del MIUR COME UTILIZZARE AL MEGLIO L AMMINISTRAZIONE DEL BLOG

Hai domande sul nuovo concorso Lines Arcobaleno?

COME ELIMINARE PARTI DEL TEMPLATE IN PAGINE SINGOLE

Manuale servizio Webmail. Introduzione alle Webmail...2 Webmail classica (SquirrelMail)...3 Webmail nuova (RoundCube)...8

Come creare una pagina Facebook e collegarla al sito mosajco

Vi ricordiamo che per qualsiasi problema tecnico o informazione potete contattare info@eduitalia.org oppure Francesco al

Dropbox di classe. É un servizio internet fornito gratuitamente (funzioni base).

FtpZone Guida all uso Versione 2.1

1.0 GUIDA PER L UTENTE

Manuale Utente Albo Pretorio GA

MOCA. Modulo Candidatura. [Manuale versione 1.0 marzo 2013]

Il calendario di Windows Vista

GESGOLF SMS ONLINE. Manuale per l utente

Manuale d uso Lexun Area Riservata proprietà di logos engineering - Sistema Qualità certificato ISO 9001 Det Norske Veritas Italia

Guida alla registrazione on-line di un DataLogger

FtpZone Guida all uso

Il portale dell edilizia di qualità domuslandia.it è prodotto edysma sas

Guida per la registrazione alla piattaforma di Gestione dei Corsi per il Consulente Tecnico Telematico

Amministrazione gruppi (Comunità)

Guida passo-passo. Per imparare a usare il tuo TwinSpace

INSTALLAZIONE JOOMLA SU SPAZIO WEB FREE ALTERVISTA

filrbox Guida all uso dell interfaccia WEB Pag. 1 di 44

LA STRUTTURA DEL SITO

GUIDA AL SITO DELLE RIPARAZIONI BARWARE SOMMARIO

Manuale Utente Amministrazione Trasparente GA

PLIDA Progetto Lingua Italiana Dante Alighieri Certificazione di competenza in lingua italiana

COME FARE UNA RICHIESTA DI ASSISTENZA ON LINE (AOL)

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

Guida Joomla. di: Alessandro Rossi, Flavio Copes

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

GUIDA ALL ACQUISTO DELLE FOTO

IL MIO PRIMO SITO: NEWS

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

I tutorial di MadLabs.. Installazione e prima configurazione

Associazione Culturale Il Cerchio Sciamanico

- Il sito dedicato alle associazioni no-profit di Milano e provincia

Crea questionari on-line, test e quiz in pochi minuti!

Mentore. Presentazione

Informatica per la comunicazione" - lezione 13 -

Procedura di iscrizione alla Piattaforma On Line

Questa guida è stata redatta per gli insegnanti amministratori che entrano in TwinSpace per la prima volta. Vi aiuterà a:

FPf per Windows 3.1. Guida all uso

Il Sito web professionale dedicato al settore Trasportatori e spedizionieri. Provalo subito all indirizzo web:

Esercizio data base "Biblioteca"

Amministrazione gruppi (all interno della Scuola)

C.I.C. Centro Informazione e Consulenza. Guida all uso del registro elettronico

Un saluto a tutti e benvenuti in PUBLICEL.

Ciao, intanto grazie per essere arrivato/a fin qui.

STUDIUM.UniCT Tutorial per gli studenti

USARE JOOMLA 1.7/2.5 per gestire il vostro sito.

Manuale d Uso di Mailchimp:

Cerca Compra Vendi. Guida passo per passo all utilizzo del sito

Moodle Breve Guida per il Docente versione 1.2. A cura di Federico Barattini federicobarattini@gmail.com

Creare un nuovo articolo sul sito Poliste.com

Note Operative per Accedere alla Posta Elettronica Certificata (PEC) Obbligo Iscrizioni 2011

FRANCESCO MARINO - TELECOMUNICAZIONI

È una pagina web a cui chiunque può iscriversi e condividere informazioni con altre persone, di solito amici e familiari.

INTRODUZIONE I CICLI DI BORSA

Note per scaricare e installare il software cliccando alla pagina DOWNLOAD del sito,

Questa guida vi illustrerà i principali passaggi da eseguire per l'inserimento dei Bandi di gara.

IL CURRICULUM VITAE (sezione verde)

Una piattaforma per creare blog, che utilizza il linguaggio PHP e si

Manuale del portale Club Filiali

Guida all installazione e configurazione di Joomla 1.5

Express Import system

Service Unavailable. Come Faccio a... Entrare nella mail o nella pagina di accesso alla mail. Evitare di ricevere alcuni messaggi

Proteggiamo il PC con il Firewall di Windows Vista

Mini guida per il corretto posizionamento dei banner, la scelta dei formati e qualche piccolo consiglio utile all ottimizzazione dei guadagni.

30 giorni di prova gratuiti, entra nel sito scarica e installa subito mypckey

MANUALE PER L UTILIZZO DELLA FUNZIONE EVENTI Rel.1.2 del 29 gennaio 2004

Procedura di iscrizione alla Piattaforma On Line e-learning. Q&S Qualità & Sicurezza S.r.l. PUNTO 1: Accesso alla Piattaforma... 2

<?php include './include/page.php';

Pagina 1 di 10

File, Modifica, Visualizza, Strumenti, Messaggio

In questo report troverai preziosi suggerimenti su. Come guadagnare affiliandoti a "Vai col Verde".

Guida all attivazione ipase

Progetto di Ingegneria del Software 2. SWIMv2

Drupal 7 Un CMS per la scuola

Guida a Theblog.net. cioè il sito è raggiungibile da due indirizzi, ma i contenuti sono gli stessi.

COME CREARE UNA COMUNICAZIONE / NEWSLETTER

Google AdWords. Corrispondenze Parole Chiave

Università per Stranieri di Siena Livello A1

TRUCCHI PER GIMP - Elemento a colori in foto bianco e nero

INSTAGRAM REPORT. COSA STAI SBAGLIANDO SU INSTAGRAM SE SEI UN PROFESSIONISTA O UN IMPRENDITORE MIRKOBAZOLI.COM

GUADAGNARE CON TELEGRAM L ESATTA STRATEGIA CHE MI HA PERMESSO DI AUMETARE LE VISITE DEL MIO BLOG

Guida all utilizzo di Moodle per gli studenti

A tal fine il presente documento si compone di tre distinte sezioni:

Транскрипт:

Home Su di me Contattami Collabora Pubblicità Targetweb è offerto da: 23 gennaio 2012 59 commenti Script login utente in php e mysql sicuro Nell articolo di oggi voglio approfondire con voi il perfetto sistema di login in php/mysql con uno sguardo particolare alla sicurezza del sistema. Questo articolo vi sarà molto utile se avete intrapreso la (dura) carriera dello sviluppatore php. Nella progetta di un cms che si rispetti infatti questo step è a dir poco essenziale e fornisce ai vostri utente un accesso sicuro a tutte le aree riservate del cms come gestione articoli o gestionali vari. 1/36

01. Primo passo: Creiamo la tabella mysql Il primo passo è quello di creare il database del sito e relativa tabella utenti dove andremo ad inserire i seguenti campi: A) Id: conterrà l id auto-incrementato dei vari utenti con accesso al cms B) username: Il nome dell utente (o più) che ha accesso al login. Tipo Varchar. C) password: La password univoca dell utente registrato. Questo campo va filtrato usando il comando sha1 o md5. Sha1 e md5 servono per crittografare la password in modo tale che, se mai qualche intenzionato riuscisse a leggere il campo pass questa non potrebbe essere usata in alcun modo dato che risulta scomposta secondo il metodo di crittografia scelto. Creiamo quindi la tabella all interno del database login. Per farlo accediamo a phpmyadmin. A questo punto abbiamo due scelte: la prima è creare la tabella e relativi campi in modo visuale grazie a phpmyadmin; La seconda invece è quella di inserire all interno del database login il seguente codice all interno della sezione sql del pannello: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATETABLE`login`( `id`int(11)notnullauto_increment, `username`varchar(64)notnull, `password`varchar(64)notnull, PRIMARYKEY(`id`) )ENGINE=MYISAM INSERTINTO`login`( `id`, `username`, `password` ) VALUES( NULL,'utente',sha1('prova') ); 2/36

Controllate che la tabella utenti sia stata creata in modo corretto. A questo punto siete pronti per il punto successivo. 02. Creazione della home La prima pagina del vostro cms sarà ovviamente una pagina di login. solo nel caso l utente si connetta e sia autorizzato avrà accesso alla sua sezione privata. Per fare il box di login creiamo lo scheletro con html e stilizziamo il tutto con i css come siamo abituati: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?phpinclude('config.php');?> <!DOCTYPEhtml> <html> <head> <title>collegatiperamministrareilsito <?phpecho$sito_intern <! PannellodigestionecreatodaMelRiccardo > <linkhref="css/admin.css"rel="stylesheet"type="text/css" </head> <body> <formid="login"action="verifica.php"method="post"> <fieldsetid="inputs"> <inputid="username"name="username"type="text"placeholde <inputid="password"name="password"type="password" </fieldset> <fieldsetid="actions"> <inputtype="submit"id="submit"value="collegati" <ahref="../index.php"id="back">ritornaalsito</ </fieldset> </form> </body> </html> Come vedete nella prima riga di codice ho incluso il file config.php dal quale possiamo recuperare in modo dinamico molte informazioni (come ad esempio il nome del sito). Ecco la struttura di base del file config.php (la cui funzione principale è lo storage delle credenziali per collegarsi al 3/36

database): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //generali $sito_internet="targetweb"; $data=(date("d m y")); $vers="2.0"; //URLPERHTACCESS $base_url="http://localhost/tuosito"; //connessionedb $host="localhost"; $db_user="root"; $db_psw="wtargetweb"; $db_name="target"; La base_url ci servirà per articoli futuri quindi non preoccupatevi (per ora). Ovviamente potete stilizzare il login box come meglio desiderate a seconda delle vostre esigenze. Ecco il css per stilizzare e usare i nuovi campi html5 che vedete nello scheletro di sopra. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /* LOGIN */ #login { background color:#fff; background image: webkit gradient(linear,lefttop,leftbottom background image: webkit linear gradient(top,#fff,#eee); background image: moz linear gradient(top,#fff,#eee); background image: ms linear gradient(top,#fff,#eee); background image: o linear gradient(top,#fff,#eee); background image:linear gradient(top,#fff,#eee); 4/36

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 height:240px; width:400px; margin: 150px00 230px; padding:30px; position:absolute; top:50%; left:50%; z index:0; moz border radius:3px; webkit border radius:3px; border radius:3px; webkit box shadow: 002pxrgba(0,0,0,0.2), 01px1pxrgba(0,0,0,.2), 03px0#fff, 04px0rgba(0,0,0,.2), 06px0#fff, 07px0rgba(0,0,0,.2); moz box shadow: 002pxrgba(0,0,0,0.2), 1px1px 0rgba(0, 0, 0,.1), 3px3px 0rgba(255,255,255,1), 4px4px 0rgba(0, 0, 0,.1), 6px6px box shadow: 0rgba(255,255,255,1), 7px7px 0rgba(0, 0, 0,.1); 002pxrgba(0,0,0,0.2), 5/36

6/36 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 01px1pxrgba(0,0,0,.2), 03px0#fff, 04px0rgba(0,0,0,.2), 06px0#fff, 07px0rgba(0,0,0,.2); } #login:before { content:''; position:absolute; z index: 1; border:1pxdashed#ccc; top:5px; bottom:5px; left:5px; right:5px; moz box shadow:0001px#fff; webkit box shadow:0001px#fff; box shadow:0001px#fff; } fieldset { border:0; padding:0; margin:0; } #inputsinput

127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 { background:#f9f9f9url(../images/login sprite.png)no repeat padding:15px15px15px30px; margin:0010px0; width:353px;/*353+2+45=400*/ border:1pxsolid#ccc; moz border radius:5px; webkit border radius:5px; border radius:5px; moz box shadow:01px1px#cccinset,01px0#fff; webkit box shadow:01px1px#cccinset,01px0#fff; box shadow:01px1px#cccinset,01px0#fff; } #username{ background position:5px 2px!important;} #password{ background position:5px 52px!important;} #inputsinput:focus { background color:#fff; border color:#e8c291; outline:none; moz box shadow:0001px#e8c291inset; webkit box shadow:0001px#e8c291inset; box shadow:0001px#e8c291inset; } #actions{margin:25px000;} #submit { 7/36

8/36 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 background color:#ffb94b; background image: webkit gradient(linear,lefttop,leftbottom background image: webkit linear gradient(top,#fddb6f,#ffb94b background image: moz linear gradient(top,#fddb6f,#ffb94b background image: ms linear gradient(top,#fddb6f,#ffb94b background image: o linear gradient(top,#fddb6f,#ffb94b); background image:linear gradient(top,#fddb6f,#ffb94b); moz border radius:3px; webkit border radius:3px; border radius:3px; text shadow:01px0rgba(255,255,255,0.5); moz box shadow:001pxrgba(0,0,0,0.3),01px0rgba( webkit box shadow:001pxrgba(0,0,0,0.3),01px0rgba( box shadow:001pxrgba(0,0,0,0.3),01px0rgba(255, border width:1px; border style:solid; border color:#d69e31#e3a037#d5982d#e3a037; float:left; height:35px; padding:0; width:120px; cursor:pointer; font:bold15pxarial,helvetica; color:#8f5a0a; } #submit:hover,#submit:focus {

9/36 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 background color:#fddb6f; background image: webkit gradient(linear,lefttop,leftbottom background image: webkit linear gradient(top,#ffb94b,#fddb6f background image: moz linear gradient(top,#ffb94b,#fddb6f background image: ms linear gradient(top,#ffb94b,#fddb6f background image: o linear gradient(top,#ffb94b,#fddb6f); background image:linear gradient(top,#ffb94b,#fddb6f); } #submit:active { outline:none; moz box shadow:01px4pxrgba(0,0,0,0.5)inset; webkit box shadow:01px4pxrgba(0,0,0,0.5)inset; box shadow:01px4pxrgba(0,0,0,0.5)inset; } #submit:: moz focus inner { border:none; } #actionsa { color:#3151a2; float:right; line height:35px; margin left:10px; }

03. Creazione del file di verifica A questo punto abbiasmo bisogno di un file che, una volta premuto si accedi verifichi se l utente ha i privilegi o meno di entrare. Per farlo creiamo un file verifica.php e mettiamo al suo interno questo codice: 10/36

<?php session_start();//iniziolasessione //includoifilenecessariacollegarmialdbconrelativoscriptdiaccesso include("connessione_db.php"); include("config.php"); //micollego mysql_select_db("$db_name",$connessione); //variabilipostconantisqlinjection $username=mysql_real_escape_string($_post['username']);//facciol'escapede $password=mysql_real_escape_string(sha1($_post['password']));//sha1cifral $query="select*fromloginwhereusername='$username'andpassword=' $ris=mysql_query($query,$connessione)ordie(mysql_error()); $riga=mysql_fetch_array($ris); /*Prelevol'identificativodell'utente*/ $cod=$riga['username']; /*Effettuoilcontrollo*/ if($cod==null)$trovato=0; else$trovato=1; /*Usernameepasswordcorrette*/ if($trovato===1){ /*Registrolasessione*/ session_register('autorizzato'); $_SESSION["autorizzato"]=1; /*Registroilcodicedell'utente*/ $_SESSION['cod']=$cod; /*Redirectallapaginariservata*/ echo'<scriptlanguage=javascript>document.location.href="privato.php"</s }else{ /*Usernameepassworderrati,redirectallapaginadilogin*/ echo'<scriptlanguage=javascript>document.location.href="index.php"</scrip }?> Il funzionamento generale, per chi mastica un minimo di php è abbastanza semplice, si esegue il loop sulla tabella utenti e si verifica che il nome e la password inserita sia uguale a uno dei dati inseriti in tabella. Se viene trovata una corrispondenza il file reindirizza a 11/36

privato.php, altrimenti riporta il ciclo al form di accesso iniziale perchè non si possiedono i privilegi necessari. TIPS: Se volete fare apparire un messaggio in caso di mancato login potete scrivere il link usando un testo via GET che andrà poi recuperato nell index principale. es. index.php?&messaggio=non-puoi-entrare Usando un semplice if nell index contenente il login form potete facilmente reperire il messaggio via GET: ecco lo schema: if GET >messaggio > echo messaggio 04. Proteggere la pagina privata da accesso diretto Ma come faccio a proteggere la pagina privato.php nel caso qualche male intenzionato la carichi direttamente (cosa difficile dato che potremmo usare qualsiasi nome, ma pur sempre plausibile).? Per fare questo controllo ci viene in contro la variabile di sessione cod aperta nel corso della verifica durante l accesso. La sessione indica che l utente che vuole visualizzare quella pagina HA IL DIRITTO di visualizzarla in quanto si è loggato con successo in precedenza. Detto questo possiamo verificare e proteggere la pagina da caricamento diretto in questo modo: 12/36

1 2 3 4 5 6 7 8 9 10 11 12 13 <?php session_start(); //senonc'èlasessioneregistrata if(!session_is_registered('autorizzato')){ echo"<h1>areariservata,accessonegato.</h1>"; echo"pereffettuareilloginclicca<ahref='index.php'><fontcolor= die; } //AltrimentiPrelevoilcodiceidentificaticodell'utenteloggato session_start(); $cod=$_session['cod'];//idcodrecuperatonelfilediverifica?> Easy! Basterà inserire queste poche righe di codice all inizio di ogni pagina per rendere la pagina inviolabile da un eventuale accesso diretto. 05. Funzione di LogOut con messaggio Creiamo un file logout.php e mettiamo al suo interno questo codice: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php session_start(); $_SESSION=array(); session_destroy();//distruggotuttelesessioni //creounavaribialeconunmessaggio $msg="informazioni:log outeffettuatoconsuccesso."; //lacodificoviaurlencodeinformazioni logout effettuato con successo $msg=urlencode($msg);//invioilmessaggioviaget //ritornoaindex.phpusandogetpossorecuperareestampareaschermo header("location:index.php?msg=$msg"); exit();?> Per richiamare lo script vi basterà creare un link logout al click dell utente sarà disconnesso! Nota: è obbligatorio lasciare session_start() davanti al codice. Nota2: Assicuratevi di non lasciare righe vuote prima di queste righe di 13/36

codice (la funzione header a volte da problemi). 06. Sicurezza & co. Alcune noti importanti sulla sicurezza che dovreste sapere se volete diventare degli sviluppatori: A) Sql injection: E una tecnica hacker che usa alcuni caratteri speciali per aprire il codice e rendere controlli mysql inutili, scardinando pertanto il sistema di login. Per testare il vostro login provate a scrivere: Username: admin or 1= 1 /* Password: pippo Se non avete fatto escape dei caratteri (mysql_real_escape_string) eliminando l apostrofo il sistema rendere illeggibile la seconda parte della query mysql facendo entrare chiunque e con qualsiasi password. Come faccio a difendermi? lo script che leggete in questo articolo usa la tecnica mysql_real_escape_string per risolvere questo problema. B) Brute Force: E una tecnica hacker che cerca la possibile password per accedere al sistema sfruttando alcuni algoritmi di ricerca. Nel nostro sistema abbiamo ovviato al problema usando la crittografia sha1. Se volete esiste un altro sistema chiamato md5, provatelo! C) Differenza POST/GET : questa differenza è molto importante e i primi tempi è possibile cadere in errori, più o meno gravi. Ricordate che i dati che passate via GET sono VISIBILI e pertanto intercettabili. Il metodo POST è la scelta obbligata per dati sensibili e passare dati in modo 14/36

sicuro. D) Accesso diretto: se la sessione non viene verificata in tutte le pagine, alcuni dati potrebbero essere visti in chiaro sempre a patto che il maleintenzionato sappia il nome della pagina da aprire (caso remoto, ma possibile). Per difendervi vedi il punto 4 della guida. 07. Conclusioni Bene se siete arrivati a questo ultimo capitolo avrete con tutta probabilità creato il vostro primo sistema di login utente sicuro, veloce e flessibile. Non vi fermate qui però, continuate a tenervi aggiornati sulle ultime tecniche di sicurezza per essere sempre un passo avanti rispetto ai vostri rivali. Nel prossimo articolo dedicato al mondo del php e del developing tratterò un approccio multi-livello del sistema di login, molto scalabile e diverso dal solito. rimanete connessi su Targetweb.it e condividete la conoscenza su twitter o facebook potrebbe aiutare altri che come voi vogliono imparare! evidenza, Guide, Php, targetlab 4 Tweet Like 7 Send Sono un Web Designer/Developer italiano che vuole condividere le sue personali esperienze sul Web Design e sullo sviluppo WEB. Se vuoi collaborare al mio progetto inviami il tuo articolo o seguimi sui social network! Se hai bisogno di un sito web funzionale e curato: Contattami 15/36

59 commenti Giacomo 1. bell articolo! però uffa mi rubi le idee xd Ostap 2. Non e proprio sicuro Anche $_SESSION può essere modificata dall utente. Session hijacking in che senso può essere modificata dall utente.? Onestamente non conoscevo la tecnica, in ogni caso fino a prova contraria rimane un ottimo compromesso di sicurezza poi ovviamente ognuno ha le sue idee ^^ tu cosa usi se non sui le sessioni? Ostap Alla sessione deve essere assegnato un id unico 16/36

e non il nome utente (cod) e un autorizzato (1) e facilmente sgamabile Per quando riguarda le password in hash, puoi utilizzare tecnica simile a WP http://goo.gl/ugrir Interessante grazie Ostap provo tutto e aggiorno l articolo con i vostri consigli, thanks! Ma quello che hai linkato è il sistema che usa wp? oly1982 3. Gli hash come md5 sha1 non servono per proteggersi dai brute force. Questi eseguono tentativi ripetuti e se si utilizza una password semplice o classica (come da esempio prova ) fra i tentativi effettuati verrà scovata in breve tempo. Gli hash vengono impiegati per due motivi: - deontologico: nemmeno l amministratore del sito/database deve poter conoscere le password dei propri utenti (infatti vi è l abitudine ad utilizzare sempre la stessa su diversi servizi web). - sicurezza: in caso di sql injection il malintenzionato, in caso di password in chiaro, verrebbe in possesso delle password di tutti i nostri utenti. 17/36

Non saranno proprio la soluzione ma sono comunque una soluzione secondaria molto utile per proteggersi e per evitare come dici tu in caso di sql di prendere le password in chiaro =D Ovviamente meglio proteggersi con password alfanumeriche abbastanza lunghe ^^ ( e magari con simboli). Giacomo 4. Io di solito quando faccio sistemi di login associo ad ogni utente un codice generato casualmente tramite un array e salvo nel cookie o nella sessione quel valore. è un metodo abbastanza sicuro visto che anche se il cookie o la sessione possono essere modificare a meno che non hai un c*** assurdo la vedo dura trovare il codice di un altro utente Alessandro 5. Ottimo articolo soprattutto per gli spunti di tutti gli sviluppatori. Personalmente trovo che combinare la tecnica delle password in hash con un codice alternativo generato in maniera casuale (come suggerisce Giacomo) anch esso in hash possa essere un buon compromesso. Per il resto, che si scelga SESSION o COOKIE entrambe sono modificabili 18/36

quindi bisogna per forza escogitare qualcosa di alternativo. Grazie Alessandro! sto studiando un metodo per difendersi anche dalle session thief. Enrico Martelli 6. Salve, mentre provavo questo codice sul mio sito, mi sono accorto che nel tutorial non c è il file connessione_db.php, e senza di questo mi da diversi errori (credo, visto che gli errori che mi trova sono appunto l include mancante e la variabile $connessione che deduco appartenga al file connessione_bd.php). Volevo chiedere quale fosse il contenuto di questo file mancante. Grazie Ciao Enrico, ecco qua: <?php include("config.php"); //includo file configurazione per recupero variabili $connessione = 19/36

mysql_connect("$host","$db_user","$db_psw"); if(!$connessione) { die("errore critico di Connessione al Database". mysql_error()); }?> In ogni caso nelle prossime settimane posterò un altra versione riadattata grazie ai vostri consigli sulla sicurezza! (sto studiando per voi hihi). Enrico Martelli Grazie mille. Se può servire qui http://wordpress.org/support/topic/phpdeprecated-warnings-on-every-screen c è scritto il motivo dell errore DEPRECATED, e c è scritto un semplice rimedio. Grazie per la segnalazione enrico! 20/36

Giuseppe 7. Ciao, sto provando il tuo script ma mi da questi errori: Deprecated: Function session_is_registered() is deprecated in C:\xampp\htdocs\cms\privato.php on line 4 Notice: A session had already been started ignoring session_start() in C:\xampp\htdocs\cms\privato.php on line 11. Complimenti per lo script Ciao Giuseppe verifica di posizionare lo script in alto alla pagina, Assicuratevi di non lasciare righe vuote la 1 riga deve partire con Giuseppe 8. Ho notato che forse ci sono degli errori nella pagina privato.php è ripetuto due volte session_start() e poi mi da un problema con!session_is_registered. Ciao e grazie prova a eliminare il secondo session_start anche se mi pare strano, se hai facebook iscriviti alla pagina o aggiungimi come amico che ti do un pò di supporto per quanto mi è possibile 21/36

Salvatore 9. Bell articolo! Eventualmente, per aumentare ulteriormente la sicurezza, potresti implementare il così detto password salting, aggiungendo alla password una stringa alfanumerica bella lunga prima di farne l hash. In questo modo, nel caso in cui qualcuno riesca con un attacco ad entrare nel database e a rubare la tabella utenti, sarà molto più difficile per lui riuscire a decifrare le password (anche quelle più deboli) non conoscendo la stringa che hai aggiunto. L ideale è salvare la stringa salt in un posto sicuro, ovvero in una cartella non accessibile via web. Framework come cakephp (e non solo) implementano nativamente questo sistema nelle loro classi di autenticazione. Grande salvatore! ottimo consiglio! Enrico 10. ciao, complimenti per lo script una domanda banale, come hai fatto a mettere omino e chiavetta nei campi user e password? Fanno la loro figura 22/36

Grazie, Enrico Guarda i css del login form css3 rulez Andrea 11. Ottimo articolo, complimenti! Piccolo appunto: per le password è meglio non usare MD5, ormai è troppo insicuro. Meglio affidarsi a SHA1 in attesa dello standard di SHA2 Grazie Andrea a breve pubblicherò un articolo (una tesi più che altro!) sul mio nuovo sistema di sicurezza v.2.0 in cui ho tenuto conto dei consigli di voi lettori e ho studiato alcuni libri relativi alla sicurezza. Stay Tuned! Andrea Ottimo, lo leggerò sicuramente!! 23/36

Un altra domanda, magari anticipo qualcosa che verrà trattato in questo nuovo articolo. Quando viene eseguita la richiesta POST tra la pagina di login e lo script php i dati passano in chiaro. C è un modo (sicuro e affidabile) per risolvere questa cosa? O bisogna affidarsi ad https? Grazie e ancora complimenti! Purtroppo penso che https sia l unica soluzione anche se con POST sei abbastanza tutelato Aldo 12. Ciao mi è piaciuto l articolo, complimenti. Ho però trovato un piccolo errore, non specifichi il database. Per risolverlo dovresti modificare il file di verifica, questa riga: $query = SELECT * FROM login WHERE username = $username AND password = $password ; dovrebbe diventare: $query = SELECT * FROM $db_name.login WHERE username = $username AND password = $password ; In questo modo funziona Ciao e ancora complimenti 24/36

Nessun errore, controlla meglio appena sopra mysql_select_db("$db_name",$connessione); Aldo 13. Scusa hai agione, scusa avevo modificato un po lo script e non mi ero accorto che la selezione del database l avevo tolta. Comunque è giusto anche il mio metodo. Ciao e complimenti ancora! sisi certo sono due metodi uguali! Grazie della segnalazione comunque! Ciao! Giuseppe 14. Ciao complimenti per l ottimo articolo, sto provando ad implementare lo script per far autenticare gli utenti in alcune pagine secondo livelli di 25/36

autenticazione ma ho problemi non capisco come fare,,,un aiutinino?? Grazie Ciao Giuseppe, l autenticazione più elementare si ottiene aggiungendo un campo alla tabella contenente i tuoi utenti. Ad ogni utente associ un ruolo e sviluppi il tuo cms/applicazione in modo che ad ogni ruolo vengano assegnati solo diversi diritti. Quest ultima parte la puoi fare usando degli handling al caricamento delle varie aree/sezioni. Non è una cosa tra le piu semplici (soprattutto per avere una sicurezza ottimale). Giuseppe 15. Grazieee Riccardo, io ho inserito nel file da proteggere dopo l inclusione del file privato un if SESSION ed è tutto perfetto. Posso fare una domanda stupida? Non riesco ad inserire le immagine nel login. Credo che mi manchi il file login-sprite.png. Grazie Giuseppe Enea 26/36

16. Ciao Riccardo hai già sfornato la versione 2 di questo già ottimo sistema dia utenticazione? A dire il vero si, mi serve ancora qualche settimana di test e poi l articolo enea Se la posto qui come beta ti aiuto a testarla. xeryan 17. aggiungo questo: per fare la funzione ricorda i miei dati si usano i cookie, dove viene memorizzato ID utente e un token, si dovrebbe controllare sempre che l utente corrisponda all ID nella sessione, perchè i cookie si possono facilemente modificare.. le sessioni invece è molto più difficile, oserei dire impossibile ma non voglio sbagliarmi xeryan 27/36

18. ma anche no ^^ scusate mi sono sbagliato, basta controllare in ogni pagina che il token corrisponda effettivamente all utente associato nei cookie, questo dovrebbe bastare Luca 19. Ciao sarei interessato a un cms per annunci vetrina quanto mi costerebbe?il mio contatto skype e leo-lleon contattatemi Ciao Luca ti ho aggiunto a skype! Edoardo 20. Il database alla creazione delle tabelle segnala errore Matteo Mosconi 21. Onestamente trovo il login molto simile a quello di Red Team Design Oltre che ribadire che è importante salvare solo gli hash delle password ti consiglio di inserire in sessione l ip dell utente e confrontare ogni volta che la persona che richiede il file abbia lo stesso ip di quello in sessione, 28/36

altrimenti la sessione deve essere distrutta. Questo può essere utile per proteggersi ulteriormente dalla manipolazione dei cookie. Cheers Ciao Matteo si stilisticamente la base è quella di red team =). ad ogni modo se leggi qualche commento sopra e nell articolo vedrai che dovrebbe uscire il nuovo articolo rivisto su questo tema in cui ho fatto tesoro di alcune vostre segnalazioni e molto altro. A presto! Guido 22. Ciao Riccardo! Complimenti un tutorial molto interessante e ben scritto! Ogni volta che passo da queste parti trovo sempre buoni motivi per ritornarci! Federico 23. Ciao mi chiedevo se avessi già aggiunto il nuovo articolo con i vari suggerimenti, sono molto curioso di vederlo Federico 29/36

24. Ciao Riccardo, a quando il nuovo articolo? Sono molto curioso di vederlo. Ciao Federico in questo periodo sono davvero troppo indaffarato con il lavoro, di sicuro se ne riparla a Settembre insieme ad alcune novità riguardo il blog. Se non vuoi perdere nemmeno un articolo iscriviti alla fanpage di Facebook o alla newsletter. Rocco 25. Ciao Riccardo, sto provando il tuo sistema ma ricevo questo errore: Notice: A session had already been started ignoring session_start() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\cms\area\privato.php on line 8 Penso sia lo stesso che capitava a Giuseppe. Grazie in anticipo. Ciao Rocco sei sicuro che prima di session_start() non ci sia qualche spazio o codice? 30/36

Matteo 26. Se non sbaglio mysql_real_escape_string() è deprecato Ciao Matteo, sì infatti la nuova versione in programma è realizzata con PDO. Ti invito a visionare la prima guida PDO nella relativa sezione del sito. newbie 27. temo di avere fatto qualche errore perchè le pagine protette mi si aprono quando vi si accede direttamente dopo che è stato fatto almeno un accesso corretto sulla stessa macchina. le session restano sulla macchina indipendentemente dall avvenuta autorizzazione. significa che se qualcuno prende la postazione di un utente autorizzato accede immediatamente al sito anche senza conoscere username o password. è un errore mio o un bug del programma? Matteo Non e un problema, funziona cosi su tutti i siti twitter e facebook compresi. La sessione rimane aperta finché non chiudi il browser. 31/36

newbie 28. grazie per l aiuto ma anche chiudendo il browser la sessione è sempre lì. Sei sicuro di aver inserito correttamente i file per il controllo della sessione così come viene spiegato nell articolo? newbie 29. ringrazio ancora per l attenzione che mi dai. in realtà non ho copiato tutto esattamente per ragioni diverse (avevo già fatto una parte di autenticazione molto simile e l ho adattata) ma la filosofia è la stessa. il problema mi nasce dal fatto che le session restano comunque sulla macchina anche dopo avere chiuso il browser e me le ritrovo pure successivamente quindi. inoltre non riesco a distinguere quando sto facendo il primo accesso alla prima pagina da quando vi sto ritornando dopo essermi già autenticato. per questo probabilmente mi resta la session sempre viva. aggiungo che,prevedendo che si possa uscire senza logout, non ho implementato una gestione specifica il che rende il mio codice 32/36

parzialmente diverso ma non nella sua filosofia. è possibile che un utente cambi semplicemente sito senza fare logout. spero di essere stato chiaro newbie 30. come si comporta il programma nel vostro caso se, dopo essere stati validati, per qualunque motivo si torna alla prima pagina (quella con i $_POST). come si fa a controllare la correttezza della password se i $:POST per username e password non sono più settati? più semplicemente: como distinguere il caso di un primo accesso (in cui bisogna impostare SESSION) con quello in cui, dopo essere stato ammesso al sito, voglio ritornare sulla pagina al punto n.3? ps: a me risulta che registrare le sessione sia deprecato Clear 31. Ma se io volessi richiamare l username o qualsiasi dato utente di chi si è loggato dopo che la sessione è iniziata? Ad esempio, io mi loggo, e poi vado su una pagina dove vedo stampato il mio nome, la password e tutto quello che voglio.. Come faccio? Giacomo 33/36

32. Ciao Riccardo, Stavo provando ad utilizzare la tua pagina di login con verifica intanto per fare un po di pratica, ma riscontro un problema quando vado ad effettuare il login, cioè al posto di indirizzarmi su una pagina come hai scritto tu privato.php mi indirizza direttamente in index.php come se user e password siano sempre sbagliate anche se sono prova prova come posso fare? grazie Lascia un Commento I campi con *sono obbligatori. Nome * Email * Sito web Messaggio * 34/36

Invia commento! Mandami una email se qualcuno risponde al mio commento Articolo precedente Articolo Successivo Contact me! Hai un problema con il tuo sito web e desideri una consulenza? Oppure vuoi solamente salutarmi e chiedermi delle informazioni? Clicca qui sotto per contattarmi! Sarò felice di rispondere in brevissimo tempo! Contattami! Hai bisogno di un sito internet funzionale,curato e personalizzato fatto su misura per te e le tue esigenze? Contattami senza impegno sarò felice di darti una mano! Richiedi Consulenza/Preventivo Articoli Recenti PHP Recuperare la lingua di chi naviga nel vostro sito Capire e scoprire il responsive design Stilizzare il testo del placeholder con i CSS WordPress: problema con i link e l anteprima di Facebook #3 Letture di Web Design e Sviluppo del Week End Creare un infografica come curriculum: Cvgram.me Nuovi Share buttons PSD 35/36

My profile Salve a tutti sono un Web Designer e questo e il blog dove condividerò tutte le mie esperienze e novita sulla programmazione e sul mondo del Web Design. Ho intrapreso la carriera da Web Designer iniziando dalle basi. Autodidatta, ho iniziato studiando Photoshop e HTML/CSS. Imparate le fondamenta del web 2.0 mi sono concentrato sullo studio di PHP/MYSQL dapprima usando CMS Open Source quali Joomla e WordPress fino ad arrivare a costruire CMS e sistemi di gestione creati da me. Scopri qualcosa su di me... Siti Amici Archivio Fotografico Casadei Amerigo Ciro Marandola Explosive Lab Gabriele Romanato miniscript Pietrapania Studio Simone Design Succo Design Vincenzo La Rosa Yes Web Can 2012 Targetweb. All rights reserved. Vietata la copia o ri-distribuzione del materiale. Gestito e creato (con passione) da. Top 36/36