PHP – SQL prepared statement inserimento

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:

ValoreDescrizione
“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().

Ricapitolando

prepare

bind

variabili

store_result —>solo per select

metodi sulla select

close()

Pubblicato in Senza categoria | Lascia un commento

TPSIT – SHA

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-1SHA-224SHA-256SHA-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:

  1. A = 67452301
  2. B = EFCDAB89
  3. C = 98BADCFE
  4. D = 10325476
  5. 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

Pubblicato in Senza categoria | Lascia un commento

PHP – Esempio di login e registrazione

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:

Pubblicato in Senza categoria | Lascia un commento

PHP – Mysql – INSERT -SELECT

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 metodo num_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:

Pubblicato in Senza categoria | Lascia un commento

SQL – Integrità referenziale

Con l’avvento dell’integrità referenziale nello standard SQL, alcuni controlli, come la verifica dell’esistenza di un Dipartimento con lo stesso cod_dipart per un Impiegato appena inserito viene delegata al DBMS.

Per un aggiornamento corretto ed efficiente dei dati nel database questi devono essere strutturati in una maniera particolare, detta forma normalizzata.

Dobbiamo tener conto che oltre la prima, la seconda e la terza forma normale esite anche la quarta e la quinta forma normale.

Supponiamo di avere la seguente struttura dati:

Dati di progetto

ed è non normalizzata.

I FORMA NORMALE

Il primo passo è quello di eliminare i gruppi ripetitivi per arrivare alla prima forma normale (1NF o FNF).

1NF

La teoria relazionale non consente che gruppi ripetitivi di colonne siano presenti nella stessa tabella. I dettagli del progetto non possono includere gruppi relativi di colonne che descrivono i compiti degli impiegati che lavorano sul progetto. Alcuni progetti prevedono un solo compito per impiegato, altri possono averne di più.

Per mantenete intatta l’originale relazione implicita tra progetto e compito, il cod_progetto è duplicato e utilizzato come colonna della chiave della tabella Compito.

Il processo viene ripetuto per altri gruppi ripetitivi in ogni tabella, passando dall’ordine più elevato a quello più basso e duplicando le chiavi successivamente ai livelli più bassi.

2 FORMA NORMALE

Il passo 2 consiste nella rimozione delle dipendenze delle chiavi parziali per arrivare alla seconda forma normale.

2NF

Se troviamo una o più colonne dipendenti soltanto da una parte della chiave composita, allora dovremo scindere di nuovo la tabella.

Notare che la tabella DETTAGLI_IMP include dei dati ripetitivi sulle precedenti funzioni di un impiegato. Ciò implica che questa tabella non è nella prima forma normale; pertanto dobbiamo scindere le colonne in CURRICULUM.

Terza forma normale

Il passo 3 consiste nella rimozione delle colonne transitivamente dipendenti.

Questo tipo di dipendenza si verifica quando le colonne di una tabella non descrivono l’oggetto rappresentato dalla tabella stessa, ma qualcos’altro identificato da una colonna che non è parte della chiave della tabella, per esempio le colonne della tabella Impiegato che descrivono le caratteristiche del dipartimento o i progetti che descrivono i dipartimenti per i quali sono stati programmati.

3NF

Pubblicato in Senza categoria | Lascia un commento

PHP – Interazione con l’utente: i moduli

Form

Come si nota il tag Form è all’interno del tag body dell’html.

Se si imposta method=”get”, tutte le variabili ed il loro contenuto vengono inviati ad action (lo script php, asp o cgi che si è impostato) tramite una Querystring.

Ad esempio, all’invio del form il browser sarà indirizzato ad un URL del tipo :

script.php?nome=Domenico&cognome=Nappo&eta=24

Tutto ciò che segue il carattere ? viene detto Querystring e consiste in una serie di coppie
nome-valore.

Il metodo post invece, fa sì che le variabili vengano inviate allo script come un flusso separato e non appaiono nella barra di indirizzi del browser. Inoltre, con il metodo get c’è una limitazione per quanto riguarda la quantità di informazioni da poter inviare. Con il metodo post tale limitazione non esiste.

Input

definisce gli elementi con cui l’utente può interagire ed immettere il suo input.
La sintassi è la seguente :

Tale tag è inserito all’interno del tag Form.

Può assumere vari type:

typeDescrizione
textCampo di teso
passwordCampo di testo per password
radiopulsanti di scelta
checkboxcaselle di scelta
hiddencampo nascosto non visualizzato ma invato
submitpulsante per l’invio delle informazioni
resetpulsante per resettare il modulo

Per ognuno ne faccio la sintassi e l’output:

Voglio far notare come sono ad esclusione i due radio button in quanto hanno lo stesso nome.



<select>

Eccone subito la sintassi ed il suo esempio:

In questo caso si possono fare selezioni multiple, size 4 dice di mostrare 4 opzioni le altre con una barra di scorrimento laterale. I valori si salvano in un vettore. Multiple nel senso che si possono fare più scelte usando il TAB.


In questo caso abbiamo una scelta singola ma con la possibilità di apertura successiva di un menù a tendina.

<TEXTAREA>


Allego il codice html completo con gli oggetti precedenti.

Ecco il codice php che utilizza i dati passati dal sorgente modulo.htm

Da notare alcune cose come la gestione del vettore come bisogna passare il parametro al comando print il $_POST

Pubblicato in Senza categoria | Lascia un commento

PHP – Le funzioni

Per chi già consce le funzioni nei vari tipi di programmazione il php non fa che riprendere gli stessi concetti, passaggio per valore o per riferimento. Visibilità di una variabile e così via.

Qui farò solo un ripasso per comprendere la sintassi caratterizzante le funzioni in php.

Nulla di nuovo sotto il sole, oppure far eseguire la funzione che ritorni un valore:

Ho usato un passaggio per valore.

Ma la cosa più bella di usare le funzioni è quella di poter creare un file esterno all’interno del quale salvo la mia funzione e poi inglobarla nel codice. Qui ne do un esempio:


il file somma.php è così definito:

come si nota anche il file somma.php ha i delimitatore di codice php!

Veramente molto bella tale possibilità esattamente come in C++ in cui si possono inglobare pezzi di codice scritti da altri.

Operare in tale maniera permetta ad un gruppo di programmatori di creare applicazioni complesse lavorado in parallelo su tante funzioni per poi inglobarle nel programma principale.

Pubblicato in Senza categoria | Lascia un commento

PHP – Creazione ambiente MYSQL – MySQL Workbench

Adesso cercherò di impostare e descrivere l’ambiente per il database MySQL e come si usa MySQL Workbench.

Per installare MySql sul tuo computer con sitema operativo windows, scarica il file di installazione che trovi sul sito ufficiale di MySql a questo indirizzo

installando il pacchetto selezionato chiederà nelle fasi successive quale software effettivamente installare.

Questa è la versione open source del database che per la maggior parte degli scopi andrà benissimo, ti consiglio di scaricare l’installer da 1,6 M perché ti permette di scegliere i vari moduli da installare. La versione a 64 bit non esiste per cui scarica tranquillamente quella a 32 bit. Una volta avviato l’installer, ti apparirà una finestra come questa, in cui dovrai selezionare che tipo di installazione preferisci. Io ti consiglio di selezionare quella di default.

Al termine dell’installazione sull’icona delle applicazione ne compare un’altra, selezionarla:

A questo punto selezionarla e comparirà:



selezionare Launch MySQL Installer.

Selezionare Add.

Aggiungere MySQL Server 8.0 e portarlo nello spazio a destra, poi selezionare MySQL Workbench e portarlo a destra. Al termine dell’installazione si chiederà la password di root del database per potervi accedere

Impostazione php.ini

Per poter utilizzare il database MySql con PHP bisogna individuare la linea extension=mysqli e decommentarla eliminando il punto e virgola.

ambiente MySQL Workbench

Ecco come si presenta dopo aver dato login e password di root.

Prima di iniziare si può creare uno schema o un database dall’interfaccia oppure mediante comandi php nativi. Sotto la voce server vi è la voce users e privileges usarla per creare un nuovo utente e dopo averne aggiunto uno cliccando su Add Account, si possono dare i privilegi su un opportuno database.

Pubblicato in Senza categoria | Lascia un commento

PHP – Lavorare con i files

Se si vuole lavorare con applicazioni professionali, l’accesso in lettura e scrittura a file sarà quasi inevitabile.

PHP mette a disposizione due funzioni per includere del codice in altri file, quali una libreria di funzioni, una serie di definizioni di variabili, del codice HMTL che può fungere da header o da footer delle pagine etc. etc.

Ad esempio, queste semplici righe di codice includono nel file php tutte le istruzioni html per la normale pagina html.

A questo punto chiarisco un concetto che fino a qui era vago: come devono essere salvate le pagine scritte in php? E’ buona abitudine tenere separato il codice php con il codice html. Poi nel codice php includo con il seguente comando il codice html.

Questo codice mostra come è possibile includere del codice html e lasciare il codice php “pulito”, senza contaminarlo con del codice html. In questo modo, i designers ed i redattori di contenuti possono dedicarsi a scrivere le pagine html, senza dover modificare gli script php.

Questo esempio verifica l’esistenza di un file e tutte le sue caratteristiche: data di creazione, se è modificabile o meno, dimensione e l’ultima modifica.

Da notare che le funzioni filectime() e filemtime() restituiscono le date in formato TIMESTAMP di Unix.

Questo è l’output del precedente comando:

Lettura e scrittura di un file

fgets()

La funzione fgets() legge un file riga per riga

La funzione fopen() permette di aprire un file in tre diverse modalità : lettura (r), scrittura (w) e append (a), (per scrivere in fondo al file, aggiungendo nuovi dati).

bisogna stare attenti che la variabile text deve essere prima inizializzata.

fread()

Legge il file ma a righe invece che tutto in blocco

in questo caso legge per riga ma comunque poi in fase di visualizzazione tutto il file viene letto.

file_get_contents()

Sicuramente il metodo più veloce per leggere un file è il seguente. Ricordiamoci che php non nasce per leggere i file ma questi comandi servono per leggere piccoli file.

In questo caso ogni elemento del vettore è una riga del file.

Non esiste il metodo migliore o peggiore alla fine basta conoscere un metodo per leggere un file.

fwrite()

Si deve introdurre la funzione flock(), a cui bisogna ricorrere ogni volta che la scrittura di un file si può verificare in multiutenza. In pratica, lo scopo di questa funzione è bloccare il file ad un singolo utente, in modo che gli altri utenti che tentano di scrivere nel file trovano la risorsa occupata, aspettando che venga rilasciata per poter poi operare.
Sintassi:
flock(file_pointer,x)
dove x può essere :
1 Condiviso (tutti possono leggere ma nessuno può scrivervi)
2 Esclusivo (nessuno può leggere o scrivere, tranne chi ha ottenuto il privilegio)
3 Rilascio (Rilascio del file)

Copia di un file

Eccone un esempio:

Notate come avviene la chiamata ad fputs(). Come secondo parametro, cioè come dati da
scrivere nel file DOLLAROdest, si sfrutta ciò che ritorna la funzione fread operante sul file DOLLAROsrc.

Pubblicato in Senza categoria | Lascia un commento

PHP – Le espressioni regolari – regular expressions

Le regular expressions (espressioni regolari) servono per descrivere dei modelli di stringa. E’ possibile verificare, ad esempio, se un codice fiscale o un indirizzo email sono stati inseriti correttamente.

Un’espressione regolare è una stringa, definita pattern, che contiene al suo interno una serie di simboli attraverso i quali è possibile identificare gruppi di stringhe.

Con il rilascio della versione 5.3 di PHP le funzioni ereg per le espressioni regolari POSIX sono state dichiarate deprecate e verranno rimosse dalla release 6 del linguaggio; utilizzarle non è quindi più una buona pratica, chi desidera impiegare un’alternativa potrà farlo grazie alle funzioni PCRE.

Un’applicazione immediata è quella di controllare i caratteri inseriti in una form che poi verrà usata per fare una query in un database. Il controllo della lunghezza e del tipo di caratteri immessi è fondamentale affinché la query successiva possa aver esito positivo.

Questo controllo è alla base delle pagine dinamiche.

Eccone un esempio:

preg_match()

controllo che lo username sia corretto ossia che contenga solo caratteri minuscoli e lettere, inoltre che abbia lunghezza minima 3 e massima 15.

Inoltre il comando deve essere sempre compreso tra //

Un altro esempio è il seguente:

Che fornisce come output:

340

8652066

quindi estrae il prefisso ed il numero di telefono. Si è usato il comando \d per identificare i numeri e \d* per prendere tutta la sequenza di numeri.

Proviamo solo a pensare quali controlli si devono fare in C++ per la coerenza del dato ed invece la potenza di tale comando.

Adesso unisco i due esempi precedenti supponendo di aver creato una form in cui ho richiesto il numero di telefono e devo controllare il campo e successivamente prendere il prefisso ed il numero di telefono:

Questa tabella mostra tutti i parametri che possono essere inseriti

Meta carattereDescrizione
\Carattere generico di escape
^Delimitatore di inizio della stringa
DOLLARODelimitatore di fine della stringa
.Definisce ogni carattere eccetto il carattere di invio
[Carattere di inizio della definizione di classe
]Carattere di fine della definizione di classe
|Inizio di un ramo alternativo
(Inizio subpattern
)Fine subpattern
?Indica 0 o 1 occorrenze
*0 o più occorrenze
+1 o più occorrenze
{Inizio intervallo minimo/massimo di occorrenze
}Fine intervallo minimo/massimo di occorrenze
Indica un range di caratteri all’interno di parentesi []
.Indica un singolo carattere
\sUn carattere di spaziatura (space, tab, newline)
\STutto eccetto un carattere di spaziatura
\dUn carattere numerico (0-9)
\DTutto eccetto un carattere numerico
\wUna lettera (a-z, A-Z, 0-9, _)
\WTutto eccetto una lettera
[aeiou]Uno dei caratteri compresi nella parentesi
[^aeiou]Tutto eccetto i caratteri compresi nella parentesi
(foo|bar|baz)Una delle alternative tra parentesi

preg_match_all()

E’ un comando simile al precedente solo che estrae tutte le occorrenze presente nel criterio di ricerca, ad esempio il seguente estratto di codice:

che cerca i codici numerici all’interno della stringa e fornisce come output i tre numeri.

preg_replace()

Si può sostituire un’espressione con un’altra.

ParametroDescrizione
DOLLAROpatternPattern di ricerca.
DOLLAROreplacementLa stringa che verrà sostituita.
DOLLAROsubjectStringa da sostituire.
DOLLAROlimitLimite delle sostituzioni da effettuare (opzionale).

in questo esempio sostituisco i numeri di telefono con degli asterischi, si pensi ad esempio ad una password immessa che deve essere sostituita con degli asterischi o viceversa.

Pubblicato in Senza categoria | Lascia un commento