addslashes non risolve il problema, intval lo aggira solo in alcuni contesti
innanzi tutto devi togliere le slash che PHP inserisce in automatico (se le inserisce in automatico) quindi qualcosa tipo
codice:
// Verifica se il magic quote è attivo
if (get_magic_quotes_gpc())
{
// Effettua lo stripslashes ricorsivo su tutti i valori in ingresso
$_GET = stripslashes_recursive($_GET);
$_POST = stripslashes_recursive($_POST);
$_COOKIE = stripslashes_recursive($_COOKIE);
$_FILES = stripslashes_recursive($_FILES);
$_SERVER = stripslashes_recursive($_SERVER);
}
ove la stripslashes_recursive è la seguente funzione
codice:
function stripslashes_recursive($Array, $Deep = 0)
{
// Verifica la profondità
if ($Deep >= 10)
{
// Se viene superato il valore limite di profondità di 10, eventualmente il
// valore va cambiato nell'if sopra, in automatico il codice si blocca perché
// l'array è troppo profondo e si rischiano problemi con la ricorsione o possibili
// (D)DoS
throw new Exception(sprintf('Can\'t strip slashes from a so deep array', $Deep));
}
// Cicla l'array
foreach($Array as $key => $value)
{
// Verifica se è un array
if (is_array($value))
{
// Effettua uno strip slashes ricorsivo
$Array[$key] = stripslashes_recursive($value, $Deep + 1);
}
else
{
// Effettua un normale strip slashes
$Array[$key] = stripslashes($value);
}
}
// Ritorna il valore
return $Array;
}
Questo è importante perché ti permette di avere dati "puliti" in ingresso e ti permette di poterci lavorare su
Il secondo punto è controllare SEMPRE i dati che ricevi, quindi se sai che il campo id ti arriva da GET ed è sempre numerico devi innanzi tutto controllare $_GET e non $_REQUEST e poi fare qualcosa tipo
codice:
$errors = array();
if (isset($_GET['id']) == false)
{
$errors[] = "l'id non è stato passato";
}
else if (is_numeric($_GET['id']) == false)
{
$errors[] = "l'id non è numerico
}
else if ((int)$_GET['id'] == 0)
{
$errors[] = "l'id deve essere maggiore di zero
}
else
{
// Visto che sono passati i controlli sull'integrità, il sistema verifica che esista la
// corrispondenza sul database estraendo la riga ed i dati annessi
// In realtà ho una mia classe facente parte del mio framework che mi permette di
// estrarre anche le singole righe oltre a lanciare le query, ma preferisco postare del
// codice "semplificato" :)
$query = db_query("SELECT * FROM tabella WHERE id = %d LIMIT 1", (int)$_GET['ìd']);
$riga = false;
while($row = mysql_fetch_assoc($query))
{
$riga = $row;
}
mysql_free_result($query);
if ($riga == false)
{
$errors[] = "il record richiesto non esiste";
}
}
// Vengono effettuate le operazioni esclusivamente se non ci sono errori
if (count($errors) == 0)
{
// fai quello che ti serve qui!
}
infine, la funzione db_query, te la posto di seguito
codice:
public function db_query($SQL)
{
// Acquisisce i parametri
$parameters = func_get_args();
// Elimina l'sql dall'elenco dei parametri
array_shift($parameters);
// Cicla i parametri ed effettua l'escape dei parametri
foreach($parameters as $key => $value)
{
// Effettua l'escape dei parametri
$parameters[$key] = mysql_real_escape_string($value);
}
// Costruisce l'SQL con i parametri
if (($sqlWithParameters = @vsprintf($SQL, $parameters)) === false)
{
// Visualizza l'errore e termina l'esecuzione
trigger_error("Errore nei parametri della query: " . $SQL, E_USER_ERROR);
return false;
}
// Esegue una query bufferizzata
$result = @mysql_query($sqlWithParameters);
// Controlla il risultato
if ($result === false)
{
trigger_error("Errore durante l'esecuzione della query " . $sqlWithParameters . ": " . mysql_error(), E_USER_ERROR);
return false;
}
// Restituisce il risultato
return $result;
}
utilizza la funzione vsprintf per sostituire ad i vari %d, %s, %f e via dicendo i relativi valori ottenendo in automatico anche la conversione del valore stesso ... prima però effettua l'escape di mysql (che aggiunge gli slash a vari elementi, non solo gli apici) dai parametri passati alla funzione