Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 38
  1. #1

    [PILLOLA] Login più sicuro con Ajax e PHP

    Premessa
    Quando non siamo su una connessione protetta parlare di un login sicuro é praticamente inutile.
    Quello che possiamo fare però è tentare quanto più ci è possibile di rendere difficile l' accesso ai malintenzionati e di salvaguardare i dati dell' utente.
    La scelta di Ajax è del tutto di convenienza mentre i concetti potrebbero essere analoghi per un' applicazione simile in Flash.


    Perche' Ajax
    Lo scopo e' quello di filtrare ancora prima di inviare le info al server i dati sensibili dell' utente.
    E' pratica comune controllare o hashare in md5 utente e password solo dopo l' invio dei dati alla pagina php che dovrebbe filtrare i furboni che vorrebbero accedere ad un' area protetta senza autorizzazione.
    Con questo metodo possiamo non solo evitare di inviare in chiaro dati durante la richiesta di accesso ma possiamo anche evitare di far elaborare una pagina piu' o meno complessa addetta allo scopo attraverso un'altra dedicata e potenzialmente ottimizzata, grazie al poco codice usato e alla poca memoria utilizzata.
    Va comunque sottolineato che a prescindere dal metodo, se non siamo in un' area protetta, un malizioso potrebbe riuscire lostesso ad intercettare tali dati, ma come ho già detto, non riuscirebbe ad intercettarli puliti.
    In ultimo, siccome e' di oggi la notizia sul blog che Ajax "può essere pericoloso", ho scelto proprio questa teconologia (ed ultimato questa pillola) proprio per farvi capire che in realtà Ajax puo' essere addirittura piu' sicuro, se usato in modo sensato.


    Di cosa abbiamo bisogno lato client ?
    Per prima cosa di un browser decente e soprattutto recente, in grado di sfruttare la tecnologia asincrona di Ajax.
    Poi abbiamo bisgono di:
    codice:
    	1 - 	Classe MD5 per JavaScript
    	2 - 	Classe personale LoadVars per JavaScript
    	3 - 	Un file per il Login, sempre JS, che effettuerà 
    		le operazioni di inizializzazione della pagina
    In ultimo, ma non per utilità, abbiamo bisogno di una pagina dove inserire lo pseudo form per effettuare il login.
    Per venire in contro a tutte le esigenze ho scritto un codice XHTML 1.1 , CSS2 e WCAG 1.0 , cosi' da non aver problemi di contesto.
    index.html ( o login.html o quello che e' insomma )
    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" >
    	<head>
    		<title>Ajax Login Example</title>
    		<script type="text/javascript" src="md5.js"></script>
    		<script type="text/javascript" src="LoadVars.js"></script>
    		<script type="text/javascript" src="Login.js"></script>
    		<style type="text/css">
    			label {
    				display: none;
    			}
    			#login {
    				padding: 2px;
    				width: 260px;
    				border: 1px solid #DDD;
    				background-color: #EFEFEF;
    				text-align: center;
    			}
    			#uname, #upass {
    				width: 80px;
    				margin-right: 8px;
    				font-family: Verdana, Helvetica, sans-serif;
    				font-size: 8pt;
    				border: 1px solid #E5E5E5;
    			}
    			#logbtn {
    				border: 0px;
    				background: url(login.gif) no-repeat;
    				width: 59px;
    				height: 23px;
    			}
    		</style>
    
    	</head>
    	<body onload="logInit('uname', 'upass', 'logbtn');">
    		<div id="login">
    			<label for="uname">User name</label>
    			<input id="uname" type="text" value="user" />
    			<label for="upass">User password</label>
    			<input id="upass" type="text" value="password" />
    			<label for="logbtn">Login button</label>
    
    			<input id="logbtn" type="button" value="" />
    		</div>
    	</body>
    </html>
    Questi sono i tasti di esempio login.gif e login2.gif



    A questo punto potete già leggervi il file Login.js il quale é commentato appositamente per capire quale é la procedura e come va sfruttata.
    Ovviamente resto a disposizione per dubbi su quanto viene fatto, ma soprattutto per consigli la dove si potrebbe migliorare l'affidabilità del sistema proposto ( vale anche per la parte in php ) .



    Di cosa abbiamo bisogno lato server ?
    Ovviamente di PHP almeno 4.3.0 , uno spazio dove poter fare i nostri tests e:
    codice:
    	1 - 	File con una funzione ( o anche piu' funzioni a seconda delle esigenze )
    		in grado di verificare l' autenticita' dei dati e di restituirci un riscontro sugli stessi
    	2 - 	File con le operazioni da effettuare per il login "trasparente"
    	3 - 	Uno o piu' files per la nostra area protetta
    L' ideale sarebbe appoggiare la funzione ad un database, ma teoricamente sarebbe possibile sfruttare il sistema anche con gestioni su filesystem.
    Ora andiamo a vedere nel dettaglio questi files e seguiamo i commenti esplicativi.


    validUser.php ( il file con la funzione di verifica dati )
    codice:
    <?php
    // funzione per verificare se in database esiste un
    // utente con questo nome e questa password
    // entrambi devono essere degli hash md5
    function validUser(&$user, &$pass) {
    	
    	// imposto il valore di ritorno
            $result = false;
    	
    	// verifico l' hash md5 dei dati
            if(preg_match("/(?i)^[a-f0-9]{32}$/", $user, $pass)) {
    	
    		// effettuo la query in database ... non in questo esempio
                    $query = 'SELECT id FROM table WHERE MD5(user) = "'.$user.'" AND MD5(pass) = "'.$pass.'"';
    	
    		// ovviamente solo se avro' un riscontro di un record ...
                    $result = true;
    	}
    	return $result;
    }
    ?>


    login.php ( il file di gestione autenticazione )
    codice:
    <?php
    // includo il file validUser
    require('validUser.php');
    
    // verifico che i valori user e pass siano stati postati
    // solo in questo caso faccio le mie operazioni, altrimenti é inutile
    if(isset($_POST['user'], $_POST['pass'])) {
    
    	// se l'utente esiste ed é valido
    	if(validUser($_POST['user'], $_POST['pass'])) {
    		
    		// imposto il cookie utente e pass e li faccio scadere
                    // alla chiusura del browser
                    setcookie('authentication', $_POST['user'].'|'.$_POST['pass'], 0, '/');
    		
    		// imposto il risultato su OK
                    $output = '&result=OK';
    	}
    	else	// imposto un output errato
    		$output = '&result=NO';
    	
    	// headers per evitare problemi di cache
    	header('Content-Length: '.strlen($output));
    	header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    	header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
    	header('Cache-Control: no-store, no-cache, must-revalidate');
    	header('Cache-Control: post-check=0, pre-check=0', false);
    	header('Pragma: no-cache');
    	echo $output;
    }
    ?>


    ok.php ( la pagina protetta dal sistema )
    codice:
    <?php
    // includo il file validUser
    require('validUser.php');
    
    // se l' utente ha il cookie ed e' splittabile ed ha 2 soli elementi
    // e passa il controllo in database ...
    if(
    	isset($_COOKIE['authentication']) &&
    	(strpos($_COOKIE['authentication'], '|') !== false) &&
    	(@$dati = explode('|', $_COOKIE['authentication'])) &&
    	count($dati) === 2 && 
    	validUser($dati[0], $dati[1])
    ) {
    	// ... continuiamo con il nostro script protetto
    	echo "<h1>Benvenuto utente loggato.</h1>";
    }
    else
    	// altrimenti l' utente e' un fagiano o un furbo che ci prova,
            // rimandiamolo al login
    	header('Location: index.html');
    ?>
    Come è facile notare i nomi sono modificabili, basta seguire il file Login.js e correggere eventuali redirect per riadattare come volete questo sistema.
    Un test funzionante é visionabile al seguente indirizzo ma non richiede una vera e propria autenticazione:
    http://www.3site.it/LOGIN/

    Ora tocca a voi insultarmi, migliorare il sistema o fare domande
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non ho guardato i file javascript, ma da quel poco che ho capito finora di AJAX il file login.php dovrebbe essere quello richiamato da js e il cui output è quindi intercettato dallo stesso.
    Se è così mi chiedo a cosa servano gli header "per evitare problemi di cache": si riferiscono a eventuali proxy intermedi?
    Mi sorge anche un'altra domanda: se invece di utilizzare i cookie avessi aperto una sessione, avresti poi dovuto gestire il cookie di sessione attraverso il codice javascript?

  3. #3
    Originariamente inviato da luca200
    Non ho guardato i file javascript, ma da quel poco che ho capito finora di AJAX il file login.php dovrebbe essere quello richiamato da js e il cui output è quindi intercettato dallo stesso.
    l' output e' fatto per la mia classe LoadVars in JavaScript, sfruttabile quindi come sistema anche da Flash MX, MX2004 e Flash 8, sempre attravero il LoadVars.

    La pagina e' ovviamente accessibile da tutti, ma solo se riceve i giusti dati fa i controlli che deve fare, un po' come qualunque pagina per login in php.


    Originariamente inviato da luca200
    Se è così mi chiedo a cosa servano gli header "per evitare problemi di cache": si riferiscono a eventuali proxy intermedi?
    i proxy intermedi non c'entrano, il fatto e' che per abitudine ogni volta che utilizzo LoadVars o faccio uno scambio asincrono di informazioni client / server, uso gli headers per evitare che il browser si ricordi l' output generato precedentemente dalla pagina richiamata ( output che tu non vedi ma che viene messo in cache ), quindi sono sicuro che il risultato sara' quello giusto, e non quello della volta precedente. Vale per un singolo utente, non significa che uno potrebbe ritrovarsi autenticato anche perche' la pagina protetta non lo permetterebbe.


    Originariamente inviato da luca200
    Mi sorge anche un'altra domanda: se invece di utilizzare i cookie avessi aperto una sessione, avresti poi dovuto gestire il cookie di sessione attraverso il codice javascript?
    Il cookie e' per evitare di usare una sessione che su un server virtuale poco curato sarebbe leggibile praticamente da tutti .... con un bel cookie invece i dati saranno solo ed esclusivamente nel pc dell' utente e non da altre parti.

    l' ideale sarebbe riadattare questo sistema ad un altro di sessioni alternative in database ... ma alla fine anche quello sfrutterebbe comunque un cookie, quindi tanto vale, se non altro per l' esempio, salvare nel cookie l' hash e buona notte.

    Le sessioni sono comunque gestibili , il punto da capire bene di Ajax, come di Flash in interazione XML o LoadVars, e' che la pagina che viene richiamata sei solo tu a non vederla, il server elabora ed il browser legge, quello che fai con una pagina .NET, Python, Perl, PHP o quello che ti pare, puoi farlo in modo trsparente tramite Ajax.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    ... successone eh sta' pillola ?


    che c'ha che non replicate, non insultate, non fate niente ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    l'idea è bella ma applicata cosi non credo abbia molto successo ... soprattutto perché molti manco sanno cos'é ajax

    forse ti conviene fare una pillola su come integrare client e server tramite php e js (ovviamente sempre tramite ajax) ... ma cambiando anche il titolo ^^

  6. #6
    Originariamente inviato da daniele_dll
    l'idea è bella ma applicata cosi non credo abbia molto successo ... soprattutto perché molti manco sanno cos'é ajax
    Magari un'introduzione era necessaria

  7. #7
    Originariamente inviato da daniele_dll
    l'idea è bella ma applicata cosi non credo abbia molto successo
    ehm, o l' idea e' bella o non ha successo ... ma comunque perche' non dovrebbe avere successo ?

    phpclasses sfrutta JS per un login, unicredit ha non so quanto js per gestire in modo analogo il login e come unicredit tante altre banche ( ovviamente puntano ad https ma il concetto di non inviare pulito rimane ) ... altri usano sistemi in js per evitare che:
    1 - l' utente possa salvare la password, nessuno si e' accorto che la pagina non richiede il salva password ? ... ricordo che salvare la password significa lasciare in un file del proprio PC dati sensibili che qualunque spyware o trojan potrebbe leggere

    2 - effettuare il login diventa un carico irrisorio per il server che con una funzione riutilizzabile e massimo una connessione ed una sola query senza dover gestire alcun output é in grado di dirci se possiamo entrare o meno

    3 - la maggior parte delle operazioni utili viene gestita da javascript ad eccezzione del solo controllo utente e password, quindi l' utente non fa avanti e in dietro per pagine di autenticazione che dicono ok o dicono login errato, semplicemente aspetta in un' unica pagina

    4 - volendo con un campo salva si potrebbe gestire il login automatico ad ogni visita dell' utente ed il sistema e' riadattabile per qualunque area di autenticazione



    Originariamente inviato da daniele_dll
    ... soprattutto perché molti manco sanno cos'é ajax
    beh, se ne parla da un po' ormai ... avessero chiesto comunque avrei risposto



    Originariamente inviato da daniele_dll
    forse ti conviene fare una pillola su come integrare client e server tramite php e js (ovviamente sempre tramite ajax) ... ma cambiando anche il titolo ^^
    un' altra ?
    http://forum.html.it/forum/showthrea...hreadid=869117
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Originariamente inviato da andr3a
    un' altra ?
    http://forum.html.it/forum/showthrea...hreadid=869117
    gia' che ci sono finisco di integrare questa mancata pillola con questo link, non si usa flahs ma i concetti sono praticamente gli stessi, trattasi di interazione LoadVars <=> PHP.

    http://forum.html.it/forum/showthrea...hreadid=457946

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    ciao andr3a e ciao daniele_dll...domandone del cavolo (forse), vedo che di mezzo c'è anche java script, possono esserci problemi con le ultime versioni di IE che di default disabilitano JS??...grazie mille!


    Buon lavoro.

  10. #10
    Originariamente inviato da kylnas1
    Magari un'introduzione era necessaria
    http://it.wikipedia.org/wiki/AJAX

    cmq ottima pillola, complimetni davvero!

    appena arrivo a casa ci smanetto meglio e la metto in pratica

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.