Evitare SQL inject

Non so se avete trovato soluzioni migliori o uguali...cmq può sempre esservi utile.

Ho realizzato questo mini script per rendere tutti i valori delle variabili passati in una pagina php innoqui al sql inject. In poke parole i caratteri ' li sostituisce con \'

 <?

foreach ($_POST as $nome) // cicla tutte le variabili presenti nel vettore POST

 {

  $_POST[$nome]=mysql_escape_string($_POST[$nome]); //i caratteri ' sono sostituiti con '\

 }

foreach ($_GET as $nome)  // cicla tutte le variabili presenti nel vettore GET

 {

  $_GET[$nome]=mysql_escape_string($_GET[$nome]); //i caratteri ' sono sostituiti con '\

 }

 ?>

commentate pure :)

inviato 11 anni fa
Toto007
modificato 11 anni fa
X 0 X

Non credo che funziona così come l'hai scritto poiché $_POST è un array associativo e il ciclo foreach non scorre tutte le chiavi dell'array ma tutti i valori.

prova così:

<?php
foreach ($_POST as $chiave=>$valore) // cicla tutte le variabili presenti nel vettore POST
 {
  $_POST[$chiave]=mysql_escape_string($_POST[$chiave]); //i caratteri ' sono sostituiti con '\
 }
?>

Comunque ci sono casi in cui non funzionerebbe, poiché questa pulizzia non è ricorsiva.

Dai un'occhiata qui:

http://www.phpnews.it/content/view/130/86/

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

si ha ragione ...solo ke nel ricopiare lo script nel forum,lasciando solo le parti fondamentali,pensavo che l'aggiunta =>$valore non era fondamentale...si vede ke non mi è ancora chiaro come funziona foreach. il segno => precisamente cosa indica?

inoltre perchè in alcuni casi non dovrebbe funzionare ? basta ke si mette all'inizio di ogni avvio di uno script ..no ?

risposto 11 anni fa
Toto007
modificato 11 anni fa
X 0 X

Per i dettagli sull'uso del ciclo foreach vedi qui:

http://www.phpnews.it/content/view/249/107/

in breve tale ciclo può essere usato in  2 modi

<?php
foreach ($array_da_attraversare as $valore_elemento)
{
   // istruzioni da iterare
}
?>

oppure

<?php
foreach ( $array_da_attraversare as $chiave_elemento => $valore_elemento)
{
    // istruzioni da iterare
}
?>

nel secondo caso riesci a recuperare anche le chiavi degli elementi presenti negli array, non solo il valore. Il simbolo => viene usato nel costrutto del ciclo for con un significato molto simile allo stesso simbolo usato nella definizione di array associativi. Es.:

<?php
$film = array('titolo' => 'Via col Vento', 'anno' => 1939,'regista' => 'Victor Fleming');

foreach ($film as $info => $valore)
{
    echo "$info: $valore <br>\n";
}
?>

Il codice che proponi non funziona nei casi in cui il form ha degli elementi a scelta multipla o degli array di check box. Es.:

<form name="form1" method="post" action="">
  <p>
    <select name="select[]" size="5" multiple>
      <option value="1">Opzione 1</option>
      <option value="2">Opzione 2</option>
      <option value="3">Opzione 3</option>
      <option value="4">Opzione 4</option>
    </select>
  </p>
</form>

Questo form ha una casella a scelta multipla, il valore di $_POST['select'] è in realtà un array che contiene tutte le opzioni selezionate dall'utente. L'algoritmo che scorre l'array $_POST dovrebbe verificare se ogni suo elemento ha un semplice valore oppure è a sua volta un array. In tal caso deve scorrere tutto l'array. Ecco perché serve mettere in piedi un ciclo ricorsivo.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

giusto :) non utilizzando nel progetto variabili a scelta multipla non mi ero posto il problema

grazie  O0

ci sentiamo

risposto 11 anni fa
Toto007
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda