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