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
ove la stripslashes_recursive è la seguente funzionecodice:// 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); }
Questo è importante perché ti permette di avere dati "puliti" in ingresso e ti permette di poterci lavorare sucodice: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; }
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
infine, la funzione db_query, te la posto di seguitocodice:$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! }
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 funzionecodice: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; }

Rispondi quotando