59 DBMS 4 – sicurezza

Dato il precedente script di login, avevamo stabilito la connessione andando ad inserire in chiaro i nostri dato.

$conn = mysqli_connect("localhost","web_visitor","007");

percui creiamo un file .ini esterno alla cartella pubblica dove andremo ad inserire i ns valori di connessione:

[DATABASE]
username = web_visitor
password = 007
dbname = quizMaker

la struttura è quella classica di questi file, con un’intestazione [DATABASE] e delle coppie di keyword -> valore che corrispondono ai nostri dati sensibili di accesso. Il formato .ini è comodo perchè php ha una comoda funzione che effettua il parsing di questi dati, restituendo un array associativo contenente i ns valori la funzione è parse_ini_file seguita dal percorso dove abbiamo ubicato il file .ini (ricordando che ../ sale di un livello nella path)

 $accessData=parse_ini_file('../../pippo.ini');

a questo basta sostituire i dati con il nome dell’array associativo e la sua chiave

 $conn = mysqli_connect("localhost",$accessData['username'],$accessData['password']);

stessa cosa per il database

 mysqli_select_db($conn, $accessData['dbname'])

Un altro metodo di hackeraggio diffuso è la cosiddetta SQL injection che consiste nell’inserire nel form dei valori con lo scopo di raggirare il nostro codice. Se per esempio nel campo email viene inserito:

 z@a.com'or'1=1

il comando sql ragionerebbe

 select psw from users where email='mail inserita' or VERO

una buona soluzione è usare msqli_escape_string che va a sostituire gli apici all’inteno della stringa con gli slash, percui nel caso precedente la mail inserita sarebbe:

'z@a.com\'or\'1=1'

gli apici interni come anche l’operatore or verrebbero valutati come facenti parte della email. Ecco $comandoSQL:

$comandoSQL = "select psw from users where email ='" . mysqli_escape_string($conn,$email) ."'";

Altra tecnica di difesa sono i prepared statements

Nel campo OOP una classe di difesa è la safemysql