Una parte cruciale della pratica di sviluppo di PHP è sempre tenere a mente che la sicurezza non è qualcosa che puoi semplicemente acquistare dallo scaffale del tuo comodo negozio locale. Garantire la sicurezza delle proprie applicazioni Web è un processo che, nel tempo, deve essere costantemente valutato, monitorato e rafforzato.
Mentre l'uso di filtri e convalida dei dati è una parte del processo di sicurezza, uno sviluppatore web dovrebbe essere consapevole del fatto che Randomization, Obfuscation e Cryptography in PHP possono fare la differenza nella sicurezza delle applicazioni web. Questo tutorial ti guiderà attraverso alcune semplici tecniche per creare e utilizzare valori casuali o univoci all'interno delle tue applicazioni web, dare un'occhiata e applicare alcune tecniche generali di offuscamento, e approfondire la scienza della Cryptology e il suo uso all'interno di PHP.
Dictionary.com definisce la casualità come:
"-verb: per ordinare o selezionare in modo casuale, come in un campione o in un esperimento, soprattutto per ridurre i pregiudizi e le interferenze causate da variabili irrilevanti; creare casuale."
La generazione di numeri casuali è determinata in vari modi, tuttavia i generatori computazionali non rispettano la "vera" casualità come si vede in natura o il rumore elettronico (il canale fuzzy, stridente, in bianco e nero in TV). Questi valori calcolati sono considerati come pseudo-casuali.
PHP ci fornisce un paio di modi diversi per creare valori casuali. Diamo un'occhiata ad alcune delle funzioni più popolari.
Le due funzioni rand ()
e mt_rand ()
sono probabilmente le funzioni più utilizzate per generare un insieme di numeri casuali in PHP. La funzione rand ()
; è un generatore più vecchio e sta cadendo in disuso a causa di mt_rand ()
; che è più veloce, più affidabile e può gestire un valore intero massimo più alto su alcune piattaforme. La funzione str_shuffle ()
fa esattamente quello che ti aspetteresti, mescola una stringa passata ad esso.
"; stampa mt_rand (0, 20); // Emette un numero intero casuale compreso tra 0 e 20 echo"
"; // Esempi di utilizzo di rand () print rand (); // default echo"
"; print rand (0, 25); // Emette un numero casuale compreso tra 0 e 25 echo"
"; // Esempio di utilizzo di str_shuffle $ string = 'abcefghijklmnopqrstuvwxyz'; stampa str_shuffle ($ string); // shuffle $ stringa?>
Il rand ()
e mt_rand ()
le funzioni accettano entrambi due parametri dove $ min
è il numero più basso con cui iniziare, e $ max
essendo il più grande numero intero con cui terminare. La funzione str_shuffle
prende un parametro, una stringa, emettendo una mutazione shuffled della stringa. Funziona come se si mescolasse un mazzo di carte.
Mentre mt_rand ();
sputerà un numero intero casuale, e str_shuffle
mescolerà una stringa in alto, una funzione ampiamente usata per creare valori univoci casuali uniqid ()
. Questo genera un identificatore univoco prefissato basato sul tempo corrente in microsecondi (via php.net). L'uso di questa funzione è utile per creare token di sessione e anche per formare i tasti, come mostrato in Secure Your Forms con Form Keys.
"; stampa uniqid (" NETTUTS ", TRUE); // Aggiunta di un prefisso aggiuntivo e impostazione di more_entropy su TRUE?>
La funzione uniqid ()
accetta due parametri il primo aggiunge un prefisso ai risultati mentre il secondo, se impostato su TRUE, aggiungerà un'entità aggiuntiva alla fine del valore restituito.
Ci sono esempi di gazillion sul web che generano password casuali, tutti fanno un buon lavoro. "Ma perché," chiedi "dovrei generare una password casuale?" Beh, la risposta, molto semplicemente, è che non devi fare affidamento sull'utente finale per fornirti una password meno sicura al momento del rilascio. Generare password casuali è molto utile nelle registrazioni degli utenti, o quando un utente fa una richiesta perché ha dimenticato la sua password. Ciò garantisce una password sicura all'inizio dell'esperienza degli utenti sul tuo sito web o può ridurre linee di codice quando un utente deve accedere nuovamente.
Diamo un'occhiata ad alcuni esempi: Esempio 1
Questo esempio mischia una stringa con str_shuffle
e restituirà una stringa all'interno di un intervallo contato. Quindi, se volessi generare una password di 8 caratteri, passerai 8 alla funzione randompassword o randompassword (8) dal tuo codice sorgente.
Esempio 2
In confronto, l'esempio prende una stringa statica e la mescola, quindi la restituisce, ad esempio due aggiunge in un sapore più dinamico (mmm gustoso). Nell'esempio due la stringa da mescolare non è più statica, ma cambia ad ogni generazione. Mentre il primo esempio è certamente sufficiente nella maggior parte dei casi per generare una password complessa, il secondo esempio ci consente di garantire che la lunghezza della stringa e i caratteri cambino con l'uso, riducendo notevolmente la possibilità di una duplicazione.
Impiegare l'uso di password complesse all'interno di un'applicazione web dissuaderà gli utenti dalla visita o dalla registrazione di un sito web. Spesso è un compromesso tra ottenere il traffico desiderato e garantire la sicurezza dell'applicazione. Suggerisco di consentire agli utenti di creare le proprie password al momento dell'iscrizione o di scegliere tra le due.
Salire le password è un modo efficace per aumentare la sicurezza degli account degli utenti anche se un utente malintenzionato accede al database, se fatto bene. Si può sostenere che, con l'accesso al sale, un utente malintenzionato può comunque ottenere le sue credenziali. Mentre questo è vero, l'applicazione di alcune tecniche di randomizzazione alla memorizzazione delle password renderà questo processo estremamente difficile, specialmente se l'archiviazione di informazioni e contenuti utente è divisa in database separati.
Ancora una volta ciò rientra nella "non dipendenza dell'utilizzatore finale per provvedere a semplici misure di sicurezza". Gli utenti generalmente utilizzano password facili da ricordare e utilizzano persino le stesse password su più siti Web (lo so, giusto !?). Le password facili da ricordare sono generalmente parole trovate in un dizionario e altri tipi di valori (ad esempio 12345, QWERTY). Come sviluppatori, spesso ci prendiamo gioco di questa pratica, ma non possiamo negare che sia così come stanno le cose.
Affinché un'applicazione web utilizzi una password salt, l'applicazione deve memorizzarla da qualche parte. Non è consigliabile utilizzare lo stesso sale su un intero database di password, ma per generare un sale unico per utente. La generazione di una quantità di sale per un intero database riduce effettivamente la sicurezza dell'applicazione Web, nel senso che se un utente malintenzionato riesce a decifrare l'intero schema è rotto, o in caso di smarrimento, rende il database inutile. Creare un sistema di registrazione dei membri completo con tutti i campanelli e i fischietti non rientra nell'ambito di questo tutorial, tuttavia creeremo un semplice sistema per utilizzare un esempio. Diamo un'occhiata a generare un sale e applicare alcune tecniche di randomizzazione:
Ecco la tabella SQL che utilizzeremo.
CREATE TABLE SE NON ESISTE 'users' ('usr_id' int (11) NOT NULL AUTO_INCREMENT, 'usr_name' varchar (24) NOT NULL, 'usr_pass' varchar (32) NOT NULL, 'usr_email' varchar (255) NOT NULL, 'usr_salt' varchar (255) NOT NULL, PRIMARY KEY ('usr_id')) ENGINE = MyISAM DEFAULT CHARSET = latin1;
Successo'; else echo 'Fallimento
'; ?>
Andiamo oltre il codice PHP. Per semplificare le cose, includiamo il nostro file di configurazione del database. PHP successivo verifica se il modulo HTML è stato inviato verificando se il file $ _POST
le variabili non sono vuote. Se non sono vuoti, lo script procede a sfuggire ai dati del modulo inviati dall'utente, preparandolo per l'inserimento nel database. Quindi generiamo un semplice sale usando uniqid ()
e mt_rand ()
e memorizzandolo nella variabile $ salt_gen
. Per salare la nostra password combiniamo la password $, quindi il sale. Prossimo passo, hashing unidirezionale delle variabili combinate con md5.
"Ma aspetta! Hai anche aggiunto l'email degli utenti nella parte anteriore della password e salt combo!" Sì! L'ho fatto perché, se un utente malintenzionato ottiene l'accesso al mio database in qualche modo, e il sale, l'unico modo in cui l'utente malintenzionato saprà per certo che l'indirizzo e-mail è utilizzato nell'hash della password è se hanno accesso a il codice sorgente Quanto è casuale e unico è un indirizzo email?
Per completare il resto del codice PHP, inseriamo le nostre variabili nella tabella del database all'interno dei rispettivi campi e forniamo all'utente feedback in caso di successo o fallimento. Ora sul resto del file di registrazione, l'HTML
Qui creiamo un semplice modulo HTML che raccoglierà un nome utente, un'e-mail e una password da un utente. Niente di eccezionale qui.
Così ora abbiamo un semplice modulo di registrazione, che inserisce un utente nel database insieme alla sua password salata. Creiamo una pagina di accesso che richiederà di recuperare le informazioni dal database e autenticare l'utente. Prima il PHP:
Yippie, siamo autenticati!'; else echo 'Oh no, non siamo autenticati!
'; else echo 'Oh no, non siamo nel database!
'; ?>
Fondamentalmente ciò che stiamo facendo nel file login.php sta prendendo le variabili del modulo inviato, afferrando la riga della tabella associata con il nome utente e ricostruendo la password dagli elementi nel database con cui è stata creata (email, pass, salt) e rimodellandoli . Quindi controlliamo nuovamente il database per il nome utente AND il valore della password rehashed per trovare una corrispondenza, emettendo l'utente in caso di esito positivo o negativo. Finalmente ecco l'HTML:
Una definizione di offuscamento semplice ma complessa è (usa la versione contenuta nel sorgente se desideri eseguire il codice):
Come puoi vedere, questo codice non è pensato per essere distinguibile. Non ci sono nomi di variabili distinte, non ci sono commenti, nessuna spaziatura, nessun rientro, nessun ordine distinto ed è tutto in una riga. Anche se non possiamo distogliere il codice, le nostre macchine sanno ancora di cosa si tratta. Funziona. Questa unica linea di caos semplicemente echos "L'offuscamento è una tecnica utilizzata per complicare il codice in modo tale da non essere comprensibile." Sì, so degli errori.
L'offuscamento ha vantaggi e svantaggi. Lo scopo è quello di impedire a una persona di scoprire cosa sta facendo il codice a prima vista o per un periodo di tempo. Questo è un vantaggio per gli individui con poca o nessuna conoscenza del linguaggio di programmazione. Tuttavia, chiunque abbia una conoscenza di base di PHP può diffondere il codice sopra offuscato e capire cosa sta facendo, potrebbe richiedere solo un po 'di tempo. Questo è uno dei difetti dell'offuscamento, non è una forma di crittografia, è solo un tentativo di essere criptico. L'offuscamento normalmente aggiunge anche alla dimensione del file. Un sacco di tempo, incontrerai codice offuscato nel software propiziatorio e malevolo.
Questa è una domanda comune. Ci sono principalmente due modi per offuscare il tuo codice. In primo luogo, puoi farlo a mano. Scrivere codice offuscato richiede molto tempo. L'esempio usato in questo articolo ha richiesto un po 'di tempo a scrivere per gli stessi motivi in cui si utilizzava l'offuscamento in primo luogo (mancanza di struttura, ordine, ecc ...), questo ha provocato anche alcuni errori umili che non volevo nemmeno scovare e aggiustare. Il secondo modo in cui puoi offuscare il tuo codice è l'acquisto di software che lo fa per te. Usare un programma per offuscare il codice è banale, e ovviamente costa molto tempo. Alcuni software che affermano di offuscare il tuo codice, in realtà lo crittografa e / o lo codifica in modo tale da basarsi su un handshake per funzionare. Spesso troverai software il cui venditore non garantisce nemmeno che il tuo codice funzionerà quando sarà terminato. Anche nell'esempio, ho usato un semplice Base64
funzione per codificare la costruzione dell'output dello script.
Dipende davvero dal tuo piano. Soprattutto se stai cercando di vendere il tuo script PHP (o qualsiasi altro software) devi licenziarlo. Questa sarà una delle difese in prima linea per contrastare il pubblico intenzionato dai software a fare quello che vogliono. Un esempio lampante di licensing può essere visto nella Wiki di Envato Marketplace. Tuttavia, potresti voler offuscare alcuni o tutto il tuo codice per qualsiasi motivo. Tuttavia a causa degli oscuramenti negativi, se sei davvero preoccupato per la sicurezza del tuo codice sorgente, potrebbe valere la pena di guardare alla crittografia.
Wikipedia.com definisce la crittografia come:
"la pratica e lo studio delle informazioni nascoste".
La crittografia è un grosso problema, sia che ne siate consapevoli o meno. In quasi tutte le applicazioni Web attualmente distribuite esiste una certa presenza di crittografia utilizzata (ad esempio, client di posta e siti Web). Come sviluppatori dobbiamo essere informati e consapevoli delle applicazioni pratiche della crittografia all'interno del nostro software. PHP ci fornisce alcune funzioni molto fondamentali e pratiche che possiamo utilizzare per crittografare i dati. In questa sezione, proverò principalmente sugli algoritmi di hashing a senso unico, anche se toccherò leggermente sulla crittografia basata su chiave simmetrica. Ce ne sono molti altri (ad es. Steganography, Asymmetric-Key per nominare una coppia).
Molto spesso utilizziamo l'hashing a senso unico come modo per archiviare in modo sicuro le password e verificare l'integrità dei dati dei file. Mentre lo facciamo, per autenticare i membri di un'applicazione web abbiamo cancellato la password degli utenti e confrontata con l'hash memorizzato dagli utenti. La stessa tecnica si applica al controllo dell'integrità dei file.
SHA-1, 2 e 3
La famiglia SHA di algoritmi hash è attualmente la più popolare, significativamente SHA-1. Anche se l'algoritmo SHA-1 può avere un punto debole, è ancora ampiamente utilizzato.
"; echo $ hash2."
"; // Produrrà: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>
In PHP, SHA-2 è chiamato in un diverso aspetto e richiede PHP 5 maggiore o uguale a 5.1.2. SHA-2 è superiore a SHA-1 e può essere chiamato con diverse dimensioni di bit.
"; echo $ hash_sha384."
"; echo $ hash_sha512."
? "; / * Uscite repspectively: sha256: SHA384 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 sha512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />
La funzione di hash è chiamata da hash (algoritmo, stringa); Nelle versioni PHP più recenti la funzione hash () può essere utilizzata per chiamare qualsiasi algoritmo hash unidirezionale per i supporti PHP (ad esempio md5, sha-1, haval, ghost). Se vuoi vedere una lista di tutti gli algoritmi di hash registrati puoi usare:
= 5.1.2 print_r (hash_algos ()); ?>
SHA-3 è ancora in fase di sviluppo e considerato per la standardizzazione. Una competizione per trovare un buon candidato ad agire come il nuovo algoritmo hash sicuro è stata lanciata dall'Istituto nazionale degli standard e della tecnologia e le voci per la competizione sono state troncate per il 31 ottobre 2008. Una voce piuttosto popolare chiamata Skein, ha un modulo PHP disponibile puoi scaricare (anche se devi compilarlo da solo). La matassa è sviluppata da alcuni grandi nomi trovati nel settore della sicurezza come Bruce Schneier, Niels Ferguson e Stefan Lucks per nominarne alcuni. Il sito web ufficiale di Skein può essere trovato qui.
I metodi di crittografia Symmetric-Key sono i casi in cui la sicurezza della crittografia risiede principalmente in una chiave, che è condivisa tra due punti, dove i dati sono crittografati e dove i dati sono decifrati. Un ottimo esempio di come questo può funzionare è stato fornito dal tutorial "Creazione di una classe di criptazione con PHP" di Christian Beikov.
Essenzialmente HMAC è come un mix tra l'hashing unidirezionale e la crittografia basata su chiave. La sicurezza HMAC si basa sulla dimensione della chiave utilizzata e sulla forza della funzione hash con cui viene calcolata. Puoi in qualche modo confrontare questo metodo con le password salate.
";?>
Bene, che viaggio! Randomizzare i valori, generare password casuali, salare, archiviare e autenticare gli utenti, confusione, crittografia ... sembra un sacco da prendere in considerazione. Ma ne vale la pena! È importante sapere quale tipo di sicurezza si intende implementare nelle applicazioni Web e come proteggerle. Ancor più, è importante mantenere un atteggiamento intelligente nei confronti di queste implementazioni e non pensare che la sicurezza sia implementata solo con alcuni metodi, ma con una combinazione di essi, con un pizzico di creatività.