Newsgroup: it.comp.www.php
Titolo: Sicurezza

Ho sentito dire che sarebbe possibile "bucare" un sito inserendo delle
particolari query mysql nei campi dei form, qualcuno ne sa qualcosa?
Ed i possibili rimedi? Un mio amico dice di togliere tutti gli spazi
bianchi dai campi che devono contenere parole tutte attaccate (ad
esempio login/password) in modo che se c'è una query non viene più
eseguita e se non c'è non succede nulla; ok questo si può fare, ma
negli altri casi?
Grazie
Francesco  
_____________________________________
Per rispondere in e-mail togli NOSPAM 

 negli altri casi?
Me l'aveva fatto vedere un mio amico.
Quello da mettere nella password non me lo ricordo, comunque veniva fuori
una querydel tipo
SELECT * FROM utenti WHERE user="aa" AND password="xxx" OR 1=1;
e ti faceva accedere come l'utente aa ( se non mi sbaglio).
La tattica è levare gli OR / AND ecc ecc dalla password, oppure mettere la
password prima dello user nel php quando creavi la stringa della query.
Non sono molto sicuro, ma è una cosa simile.
Se tu o qualcuno trova una soluzione migliore si faccia avanti ! :-)
Ciao

 
Questo avviene per campi in cui si danno le credenziali per accedere a 
servizi riservati.
Faccio un esempio: form con campi "utente" e "password".
Immagina di leggere i tuoi campi da DB in questo modo:
SELECT 1 FROM utenti WHERE password='$password' AND utente='$utente'
se qualcuno nel campo "utente" riesce a mettere la stringa seguente:
' OR '1'='1
nota che inizia con un apice e NON finisce con lo stesso apice. Quando 
$utente viene sostituito, la query diventa:
SELECT 1 FROM utenti WHERE password='boh' AND utente='' OR '1'='1'
e' un balordo come esempio ma rende l'idea: se passa prima l'OR il 
cracker e' entrato senza sapere user e password. Di solito con qualche 
tentativo si riesce a scoprire la falla, se c'e', e "bucare" il sito.
Workaround: Nei campi "sensibili" dovresti impedire di mettere caratteri 
"particolari" (spazi, apici, segno di uguale, ecc.) in modo che non si 
possano mettere espressioni complesse come quella, ma se devi tenerli in 
genere puoi iniziare mettendo le parentesi:
SELECT 1 FROM utenti WHERE (password='boh') AND (utente='' OR '1'='1')
cosi', almeno una password presente nel DB la deve trovare :D
Sistema scemo ma sicuro: cambia la query in modo da usare un campo per 
verificare l'altro.
SELECT utente FROM utenti WHERE password='$password'
e poi verifichi che $utente e il risultato della query siano uguali.
Stesso principio per i campi non identificativi.
-- 
Saluti >^_^<
Hatanaka

 eseguita e se non c'è non succede nulla;
Non ti fidare mai dell'input dell'utente. Non utilizzare
register_globals = on. Utilizza le funzioni mysql_escape_string() e
mysql_real_escape_string()
Saluti.
-- 
I'am what I'am, I do what I can

Stesso principio per i campi non identificativi.
Grazie mille, sei stato chiarissimo! Ho optato per il primo sistema,
mi sembra più elegante ;-)


mysql_real_escape_string()
mmm...ma i campi mi vengono già escapati automaticamente (magic_quotes
è on), a che mi serve escaparli di nuovo?


 ha scritto nel messaggio
news:EeF9b.106268$sj6.1...@tornado.fastwebnet.it...


 ha detto:
Ho buttato giů questa funzioncina, se puň servire a qualcuno... 
function check_form ($campo,$query=0)
/* $campo č il campo da ripulire, $query č booleano, se č vero si
rendono innocue anche le eventuali query inserite togliendo tutto ciň
che c'č dopo il primo eventuale spazio.
Funziona anche per gli array*/
{
         if (is_array($campo))
         {
            foreach ($campo as $key => $value)
                 $campo_sicuro[$key]=strip_tags($campo[$key]);
         }
         else
             $campo_sicuro=strip_tags($campo);
         if ($query)
         {
                 if (is_array($campo))
                 {
                    foreach ($campo_sicuro as $key => $value)
                    {
                         $pieces = explode(" ", $campo_sicuro[$key]);
                         $campo_sicuro[$key] = $pieces[0];
                    }
                 }
                 else
                 {   $pieces = explode(" ", $campo_sicuro);
                     $campo_sicuro = $pieces[0];
                 }
         }
         return $campo_sicuro;


 è on), a che mi serve escaparli di nuovo?
mysql_real_escape_string() fa l'escape in base alla tabella dei codici
attiva nel DB. COmunque "magic_quotes" dovrebbe andare bene lo stesso.


attiva nel DB. COmunque "magic_quotes" dovrebbe andare bene lo stesso.
Grazie dei consigli, ciao


 genere puoi iniziare mettendo le parentesi:
Un workaround facile e usare sempre addslashes(),
cosi vengono sempre mascherati apici.
In altri SQL bisogna invece stare attenti con caratteri come 
; e # -- 

 Non mi fido, ho messo anche un controllo javascript
Javascript garantisce sicurezza come un bel fiocchetto
rosa che chiude un grande cancello di ferro :)