Ultima modifica da un moderatore:
SQL Injection consiste in un attacco informatico che sfrutta la cattiva pratica di molti sviluppatori nel concatenare le stringhe destinate ad un database server. La concatenazione delle stringhe SQL viene solitamente associata a problemi di sicurezza e, sebbene questo sia sicuramente vero, affligge anche performance e provoca subdoli errori di runtime in relazione ai separatori numerici e delle date.
C'è da dire che sono molti i PHP Developer che non ritengono necessario mettere protezioni ai proprio script, credendo che i dati immessi dell'utente possano rispecchiare i soliti canoni alfanumerici.
Bene, ciò non sempre avviene e oggi capiremo come funziona L'injection dei dati SQL e come bloccarla!
Esempio di query:
Diciamo che bene o male la maggior parte di voi saprà leggere e interpretare questa query.
Sappiamo che $_POST sono le variabili globali trasemme al server mediante dei form.
Se nella nostra casella di testo dovessimo inserire qualcosa che vada ben oltre semplici lettere.. ecco che le cose si complicano.
Es:
Purtroppo, come voi sapete, uno diverso da 2 viene vista come una condizione sempre vera e quindi l'autenticazione avverrà in un modo o nell'altro.
Nel $post è stata inserita una virgoletta (un apice per meglio intenderci), per cui la query sarà interpretata in questo modo:
Come evitare ciò voi direte???
Beh fortunatamente PHP mette a disposizione moltissime funzioni utili nella sostituzione di determinati caratteri considerati "pericolosi" (per noi), e addirittura all'eliminazione di questi ultimi.
Incominciamo con qualcuna base:
strip_tags
La funzione strip_tags rimuove i tag HTML e PHP presenti in una stringa.
La funzione in oggetto ammette due argomenti:
Il risultato sarebbe:
addslashes
Questa funzione del linguaggio Php aggiunge automaticamente uno slash in presenza del carattere apice e, come abbiamo visto prima, gli apici sono le principali cause dell' SQL-Injection.
Non credo ci sia molto da spiegare.
Ovviamente possiamo far interagire assieme le due funzioni descritte sopra :
Oltra a queste semplici funzioni, possiamo anche sostituire all'interno di intere stringe caratteri che infastidiscono noi e che magari per PHP, sono innoqui.
ci viene in contro la funzione:
str_replace
Infatti quest'ultima prevede la sostituzione di un carattere con un altro .
es:
Vediamo di studiare qualcosa di più complesso che raccolga quello che abbiamo appreso sino ad ora .
Una bella funzzione in php che faccia un return di tutte le funzioni:
ed ecco che per avere un input pulito dovremmo solo scrivere:
Guida in completo aggiornamento, spero di esservi stato utile
C'è da dire che sono molti i PHP Developer che non ritengono necessario mettere protezioni ai proprio script, credendo che i dati immessi dell'utente possano rispecchiare i soliti canoni alfanumerici.
Bene, ciò non sempre avviene e oggi capiremo come funziona L'injection dei dati SQL e come bloccarla!
Esempio di query:
PHP:
<?
$post=$_POST['id'];
mysql_select_db(account);
//nel caso di metin per esempio, il database account racchiude info sugli account dei giocatori
$select=mysql_query("Select * from account where id='$post'");
?>
Diciamo che bene o male la maggior parte di voi saprà leggere e interpretare questa query.
Sappiamo che $_POST sono le variabili globali trasemme al server mediante dei form.
Se nella nostra casella di testo dovessimo inserire qualcosa che vada ben oltre semplici lettere.. ecco che le cose si complicano.
Es:
PHP:
//riprendendo il codice di prima
$post="root ' or 1!=2 ";
//ed ecco il tragico!
Nel $post è stata inserita una virgoletta (un apice per meglio intenderci), per cui la query sarà interpretata in questo modo:
PHP:
mysql_query("Select * from account where id='root' or 1!=2");
Come evitare ciò voi direte???
Beh fortunatamente PHP mette a disposizione moltissime funzioni utili nella sostituzione di determinati caratteri considerati "pericolosi" (per noi), e addirittura all'eliminazione di questi ultimi.
Incominciamo con qualcuna base:
strip_tags
La funzione strip_tags rimuove i tag HTML e PHP presenti in una stringa.
La funzione in oggetto ammette due argomenti:
- stringa da pulire
- tag ammessi (facoltativo)
PHP:
$testo = "<b>SubSilence</b> è un utente di <i>inforge</i>";
echo strip_tags($testo);
Il risultato sarebbe:
Codice:
SubSilence è un utente di inforge
addslashes
Questa funzione del linguaggio Php aggiunge automaticamente uno slash in presenza del carattere apice e, come abbiamo visto prima, gli apici sono le principali cause dell' SQL-Injection.
Non credo ci sia molto da spiegare.
PHP:
$stampa=" mi chiamo 'ciccio' ";
print (strip_tags($stampa)); //stamperà mi chiamo ciccio senza gli apici
Ovviamente possiamo far interagire assieme le due funzioni descritte sopra :
PHP:
$stampa="SubSilence e' un <b>PHP Developer</b>";
print (strip_tags(addslashes($stampa)));// stamperà SubSilence e un PHP Developer (e senza accento )
Oltra a queste semplici funzioni, possiamo anche sostituire all'interno di intere stringe caratteri che infastidiscono noi e che magari per PHP, sono innoqui.
ci viene in contro la funzione:
str_replace
Infatti quest'ultima prevede la sostituzione di un carattere con un altro .
es:
PHP:
$testo=" [email protected] ";
$testo=str_replace('@','$',$testo);
// nell'argomento della funzione mettiamo prima il carattere da sostituire, poi il carattere che andrà a sostituire il 1°, e per ultimo la stringa in cui deve avvenire la sostituzione.
print $testo; // restituirà ciao$live.it :D
Vediamo di studiare qualcosa di più complesso che raccolga quello che abbiamo appreso sino ad ora .
Una bella funzzione in php che faccia un return di tutte le funzioni:
PHP:
//Blind SQL-INJECTION Sequenze di Escape. Linee di codice utili per un anti SQL-Injection
function anti_injection($input){
$pulito=strip_tags(addslashes(trim($input)));
$pulito=str_replace("'","\'",$pulito);
$pulito=str_replace('"','\"',$pulito);
$pulito=str_replace(';','\;',$pulito);
$pulito=str_replace('--','\--',$pulito);
$pulito=str_replace('+','\+',$pulito);
$pulito=str_replace('(','\(',$pulito);
$pulito=str_replace(')','\)',$pulito);
$pulito=str_replace('=','\=',$pulito);
$pulito=str_replace('>','\>',$pulito);
$pulito=str_replace('<','\<',$pulito);
return $pulito;
}
//FINE BLIND
PHP:
$post=$_POST['id'];
$post_pulito=anti_injection($post); //$post_pulito sarà la nostra stringa pulita e sicura
Guida in completo aggiornamento, spero di esservi stato utile