Un altro esempio sull’argomento delle SQL Injection dopo l’articolo gia visto precedentemente con la form di login che potete rileggere qui. Questa volta invece di compilare la form in modo malevolo, sfruttiamo una possibile vulnerabilità del PHP: il passaggio di parametri attraverso URL e la funzione GET[].
Predisponiamo una prova sfruttando il db precedente di cui useremo la tabella prodotti. Creiamo uno script php che possiamo chiamare prodotti.php
<?php
$mysql_host = 'localhost';
$mysql_user = 'test';
$mysql_pass = 'test';
$mysql_db = 'test';
/* Connessione e selezione del database */
$connessione = mysqli_connect($mysql_host,$mysql_user,$mysql_pass);
if(mysqli_connect_errno())
die("Connessione non riuscita: " . mysqli_error($connessione));
$db_select= mysqli_select_db($connessione,$mysql_db);
if (!$db_select)
die("Selezione del database non riuscita");
//passa il parametro via link http://127.0.0.1/prodotti.php?idp=1
$idp = $_GET["idp"];
$sql = "select codice, descrizione, prezzo from prodotti where idp = $idp ";
print $sql;
$res = mysqli_query($connessione,$sql) or die("Errore in check.php : " . mysqli_error($connessione));
while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC))
{
print "<div style=’margin-left:30px; margin-top:30px; width:400px; padding:30px; border: 1px solid brown; font-family:Helvetica’>";
print "Scheda prodotto : <br>";
print "CODICE: <b>{$row["codice"]}</b><br>";
print "DESCRIZIONE: <b>{$row["descrizione"]}</b><br>";
print "PREZZO: <b>{$row["prezzo"]}</b><br>";
print "</div>";
}
?>
Come possiamo vedere, lo script semplicemente si collega al db, reperisce un prodotto e ne stampa le informazioni tabellate. Per esempio, potremmo lanciare lo script opportunamente piazzato nella directory del nostro server web con il seguente URL
http://127.0.0.1/prodotti.php?idp=1 equivalente a http://localhost/prodotti.php?idp=1
Questo potrebbe essere un link che si lancia da un’altra pagina in modo ingenuo. Un attaccante malevolo potrebbe provare ad inserire un frammento di codice sql malevolo come il seguente
http://localhost/prodotti.php?idp=1 union select username, password, 0 from users;
Come possiamo vedere, il codice malevolo non opportunamente confinato crea un bug che permette all’attaccante di visualizzare le credenziali del nostro database!
Come difenderci da questi attacchi?
Esistono funzioni predefinite, ovviamente a prova di errore come mysqli_real_escape_string che eliminano alcuni caratteri non ammissibili come le virgolette, chiocciole, cancelletti.
Un esempio di codice potrebbe essere il seguente:
$idp_sicuro = mysqli_real_escape_string($con, $_GET['idp']);
Altri sistemi utilizzatissimi sono sicuramente le funzioni:
$pulito = $trim($variabile); //toglie gli spazi
$piupulito = stripslashes($pulito); //toglie gli slash
$quasiperfetto = htmlspecialchars($piupulito); //toglie i caratteri malevoli, apici, &, < e >
Altri sistemi utilizzati per “ripulire” una variabile possono essere di controllare o forzare una tipologia di dato atteso da quella varibile. E’ indicato quando si sta passando con GET o POST un dato numerico, ad esempio action.php?idp=1234
//forzare il cast cast (int)$idp o intval($idp)
$idp = (int)$_GET["idp"]
oppure
if (is_numeric($_GET["idp"]))
echo "ok è solo numero";
//oppure
if (is_numeric($_GET["idp"])
echo "ok!";
//oppure ancora
if ($idp > 0 || $idp <100) ...
Ultima modifica 22 Febbraio 2022