La connessione a un database MySQL si realizza creando un’istanza della classe PDO: il costruttore si aspetta 3 parametri, uno obbligatorio e due facoltativi. Il parametro obbligatorio è il DSN (Data Source Name), i parametri facoltativi, almeno formalmente, sono username e password di accesso al nostro database server.
Possiamo inserire la creazione della connessione al database in un costrutto try-catch in modo da gestire eventuali errori (PDOException) di connessione, bloccare l’esecuzione del codice se la connessione stessa non va a buon fine e visualizzare la tipologia di eccezione individuata .
Si deve chiudere la connessione con il comando:
Posso creare una connessione persistente in maniera tale da migliorare le prestazioni.
PDO, acronimo di PHP Data Object, è un’estensione di PHP introdotta a partire dalla versione 5.1 del linguaggio con lo scopo di unificare le API di accesso ai database.
Come ben sintetizza il suo acronimo, PDO si presenta come una soluzione per sua natura orientata agli oggetti, l’estensione fornisce infatti un’interfaccia comune per la comunicazione con i diversi database.
Uno dei principali punti di forza di PDO risiede nel fatto che esso mette a disposizione delle sviluppatore i prepared statement, costrutti che se utilizzati sistematicamente sono in grado di mettere al riparo gli script delle minacce basate sull’SQL injection, una tecnica di attacco incentrata sull’iniezione di SQL malevolo tramite input al fine di violare le applicazioni per la gestione dati.
In conclusione è possibile sottolineare che i vantaggi derivanti dall’uso di PDO fanno riferimento alle seguenti caratteristiche:
Portabilità: grazie al supporto di più engine per la gestione di dati.
Programmazione orientata agli oggetti: grazie ad un’interfaccia nativamente object-oriented.
Sicurezza: grazie ai prepared statement che proteggono dai tentativi di code injections
Attualmente quando accediamo ad un database tramite PHP abbiamo due opzioni corrispondenti ad altrettante estensioni: PDO oppure MySQLi. Le differenze principali fra le due librerie riguardano i database supportati, la gestione dei parametri e le performance.
La principale differenza tra PDO e MySQLi sta nel numero dei database supportati: mentre MySQLi supporta, come indica il nome stesso, soltanto MySQL, PDO può supportare 12 diversi database.
La select tradizionale espone a potenziali rischi dal punto di vista dell’iniezione di codice malevolo, le sql injection infatti sono ancora al primo posto sia per la facilità di sfruttamento della vulnerabilità, sia per i rischi ad essa connessi.
Il rischio è legato all’uso incauto della variabile:
e, usata senza controllo, potrebbe contenere qualsiasi codice malevolo .
La soluzione risiede nell’uso dei prepared statement che ci garantiscono un miglioramento della sicurezza e anche delle buone performance di esecuzione, in particolare nel caso di operazioni ripetute.
Il primo passo per utilizzare i prepared statement sarà quello di preparare la nostra query sostituendo le due variabili con dei segnaposto (placeholder) che verranno valorizzati in fase di binding:
La separazione fra la preparazione dell’SQL e i dati ci permette di avere una protezione rispetto alle SQL injection, infatti i dati provenienti dall’utente verranno gestiti al di fuori dell’istruzione SQL.
A livello di sintassi si deve registrare l’assenza dei delimitatori attorno al parametro: in questo caso pur trattandosi di stringhe non è necessario delimitarle, infatti l’associazione con il tipo di dato verrà fatta in fase di binding.
I valori di bind sono i seguenti:
Valore
Descrizione
“s”
Corrisponde a variabili associate al tipo di dato stringa.
“i”
Corrisponde a variabili associate al tipo di dato numeri interi.
“d”
Corrisponde a variabili associate al tipo di dato numeri double.
“b”
Corrisponde a variabili associate al tipo di dato BLOB, formato binario.
la variabile result mi ritorna il valore 0 o 1 de il risultato del bind è corretto.
Tale operazione permette una velocizzazione dell’accesso al database e una maggiore sicurezza dei campi che verranno inseriti o cancellati.
“By using prepared statements you are separating SQL queries from user entered data. Instead of input data, you put placeholders (‘?’ char) in your SQL query. Then you send the query to the DBMS server (e.g.: MySQL) by means of the “mysqli::prepare” method. So the server checks that everything is ok and, if so, it waits for input data. By now it already knows your query. Just it has to wait for input data to bind to the query. “
Al termine del fie php inserisco sempre:
Quindi il codice sorgente che avevo usato precedentemente con il prepare, bind ed execute adesso DEVE esesere scritto nella seguente maniera:
DEVE essere presente il metodo store_result() per poi usare il metodo num_rows, alla fine del bind usare sempre il metodo close().
Con SHA intendo Secure Hash Algorithm ossia degli algoritmi crittografici di hash.
Come ogni algoritmo di hash, l’SHA produce un message digest, o “impronta del messaggio”, di lunghezza fissa partendo da un messaggio di lunghezza variabile. Avevo già trattato l’argomento nel post relativo alla firma digitale.
Gli algoritmi della famiglia sono denominati SHA-1, SHA-224, SHA-256, SHA-384 e SHA-512: le ultime 4 varianti sono spesso indicate genericamente come SHA-2, per distinguerle dal primo.
Il primo produce un digest del messaggio di soli 160 bit, mentre gli altri producono digest di lunghezza in bit pari al numero indicato nella loro sigla (SHA-256 produce un digest di 256 bit).
L’SHA-1 produce un digest di 160 bit da un messaggio con una lunghezza massima di 264-1 bit ed è basato su principi simili degli algoritmi MD4 e MD5.
Passo 1 (Imbottitura): Al messaggio originale vengono aggiunti dei bit di “imbottitura” affinché la lunghezza finale del messaggio risulti congruente a 448 modulo 512, così facendo la lunghezza in bit di “messaggio+imbottitura” divisa per 512 darà resto 448 .
Passo 2 (Aggiunta lunghezza): Alla sequenza di bit (messaggio+imbottitura) creata durante il passo 1 viene aggiunto un intero unsigned di 64bit contenente la lunghezza del messaggio originale. Alla fine di questi due primi passi otteniamo una sequenza di bit che è un multiplo di 512.
Passo 3 (Inizializzazione del buffer MD): Un buffer di 160bit suddiviso in 5 registri da 32bit ciascuno viene creato per la memorizzazione di alcuni passaggi intermedi. I 5 registri verranno convenzionalmente indicati con (A,B,C,D,E) ed inizializzati con i seguenti valori esadecimali:
A = 67452301
B = EFCDAB89
C = 98BADCFE
D = 10325476
E = C3D2E1F0
Passo 4 (Elaborazione dei blocchi da 512bit): La sequenza di bit “messaggio+imbottitura+lunghezzaMessaggio” viene divisa in blocchi da 512bit, che identificheremo con Bn con n che va da 0 a L. Il fulcro dell’algoritmo SHA-1 è chiamato compression function ed è formato da 4 cicli di 20 passi cadauno. I cicli hanno una struttura molto simile tra di loro se non per il fatto che utilizzano una differente funzione logica primitiva. Ogni blocco viene preso come parametro di input da tutti e 4 i cicli insieme ad una costante K e i valori dei 5 registri. Alla fine della computazione otterremo dei nuovi valori per A,B,C,D,E che useremo per la computazione del blocco successivo sino ad arrivare al blocco finale F
Inserisco un esempio con cui poter creare una semplicissima pagina in html in cui si effettua il login e la registrazione di un utente in un sito o in un’area riservata.
Ho utilizzato due tag form una necessaria per poter inviare al modulo logoin.php i dati di login e password e che dovrà verificare che l’utente sia presente o meno.
L’altro form invece, con metodo get, serve per andare nella pagina html registrazione.html che chiederà la registrazione dell’utente e invierà i dati al modulo registrazione.php che gestirà l’inserimento dei nuovi dati nel database degli utenti.
Ecco il modulo registrazione.php. Faccio notare il <BR> prima del msg ed inoltre il punto . prima del messaggio. Esso è necessario per concatenare messaggi diversi.
In questo file mancano i comandi mysqli necessari all’inserimento dei dati richiesti dall’utente.
Ecco il file login.php in cui verifico se la coppia login e password sono presenti:
Adesso che si è creato il database, create le tabelle si devono inserire dei record o estrarli.
In particolare inserisco un record nella tabella login.
Dopo aver eseguito tale php ho il seguente messaggio:
E vado a vedere nel database tramite Mysql workbench il valore che ho inserito.
Da notare subito che la password non è in chiaro ma ho usato la funzione SHA256 presente nativamente in php .
Siccome ho creato la tabella con un campo che si incrementa non serve chiaramente usarlo nell’insert e si demanda al DBMS la sua gestione.
Per verificare che il record sia stato inserito si possono usare i metodi affect o record id.
Il messaggio che compare dopo aver eseguito il codice precedente è:
Si evidenzia subito, comunque che una tabella così strutturata non è logicamente accettabile nel senso che posso inserire più record con la stesso login!
VERIFICA PRESENZA DEL RECORD
Il metodonum_rows(), sempre applicabile alla classe mysqli_result, restituisce il numero di righe ottenute dalla select e avremo quindi un risultato superiore a 0 solo nel caso in cui le credenziali siano valide.
Qundi num_rows è un metodo della classe mysqli_result!
Potevo usare anche un nuovo metodofetch_all
fetch_all() è un metodo molto flessibile, che produce un array per ogni record, numerico (MYSQLI_NUM), associativo (MYSQLI_ASSOC) o di entrambe le tipologie (MYSQLI_BOTH) a seconda della costante che passeremo come argomento. Il codice proposto produrrà quindi come risultato:
Il nostro sito utilizza i cookies per offrirti un servizio migliore.
Se vuoi saperne di più o avere istruzioni dettagliate su come disabilitare l'uso dei cookies puoi leggere l' informativa estesa.
Cliccando in un punto qualsiasi dello schermo, effettuando un’azione di scroll o cliccando su Accetto, presti il consenso all’uso di tutti i cookies.OkNoPrivacy policy