cos'è la sql injection?
stasera, quando torno da scuola, se attacco internet, vi posto il codice.
cos'è la sql injection?
stasera, quando torno da scuola, se attacco internet, vi posto il codice.
c'è un articolo su freephp.html.it
: - )
L'SQL Injection è una tecnica di exploiting della applicazione web, che sfrutta
i dati inviati da un client ad un Database SQL ( DS ), senza controlli sui
caratteri potenzialmente dannosi.
Infatti una moltitudine di applicazioni web, utilizzano delle particolari variabili,
che possono essere impostate da un utente per comunicare con il server; purtroppo
un utente malintenzionato, può impostare tali variabili in modo da eseguire codice
arbitrario sulla macchina remota o per accedere ad un'area protetta da password,
per esempio.
Molte applicazioni web, sfruttano il parametro SELECT; tale comando è utilizzato per
prendere i dati da una query, per poi compararli con quelli contenuti nella lista di
un database.
Ad esempio, il codice seguente, appartiene ad uno script di login, che prende lo
username e la password da una query e li confronta con quelli contenuti in una lista
( lo script preso in considerazione è fornito da freephp.html.it ) :
$login = $_GET["nlogin"];
$password = $_GET["ppass"];
$string = mysql_query("SELECT * FROM ulist WHERE login='".$login."' AND
password='".$password."'");
if (mysql_num_rows($string) == 0)
$in = 0;
else
$in = 1;
Questo è un classico esempio di script, vulnerabile a caratteri potenzialmente
pericolosi, dato che sono assenti controlli su di esse; quindi, per superare il
controllo dello script, possiamo inserire nei campi dello username ( $login ) e
della password ( $password ), il codice " OR "=" :
$string = mysql_query("SELECT * FROM ulist WHERE login=" OR "=" AND
password=" OR "="");
Come è possibile vedere, queste due condizioni sono sempre vere, quindi lo script
restituirà necessariamente un valore uguale ad 1 ( $in = 1 ).
ma il problema non si risolve facendo così:
$login = $_GET["nlogin"];
$password = $_GET["ppass"];
$string = mysql_query("SELECT * FROM ulist WHERE login='".$login."' AND
password='".$password."'");
if (mysql_num_rows($string) == 0)
$in = 0;
else
$in = 1;
Questo è un classico esempio di script, vulnerabile a caratteri potenzialmente
pericolosi, dato che sono assenti controlli su di esse; quindi, per superare il
controllo dello script, possiamo inserire nei campi dello username ( $login ) e
della password ( $password ), il codice " OR "=" :
$string = mysql_query("SELECT * FROM ulist WHERE login=" OR "=" AND
password=" OR "="");
Come è possibile vedere, queste due condizioni sono sempre vere, quindi lo script
restituirà necessariamente un valore uguale ad 1 ( $in = 1 ).
$string = mysql_query("SELECT * FROM ulist WHERE login='".$login."' AND
password='".$password."'");
if(mysql_num_rows($string)==1)
{.... qui inserisco il codice di accettazione login}
nel tuo caso da uno perchè in realtà non da 0 quindi se tu al posto di verificare lo 0 verifichi l'1 il problema dovrebbe essere risolto o sbaglio? Anche senza fare controlli??
Ho ripreso questo script perchè ho letto i 3d sull'argomento e alla fine senza fare vari controlli mi sembra che la mia soluzione sia corretta, voi cosa dite? anche se si inserisce il codice " OR "=" i risultato sarà superiore a 1 e quindi non da l'accesso in ogni caso!! ovviamente si si ha un solo utente la cosa non funziona.
aspetto commenti.
ciao
Sbagliatissimo!!!! Se nel campo pwd inserisco codice del tipo
' or 1=1
restituirà com una riga....
http://freephp.html.it/articoli/view...olo.asp?id=123
Leggi questo articolo, è abb esauriente.
ciao ciao
La (!) è quella roba che in autunno si intristisce... perche': seccano i piselli, migrano gli uccelli, cadono i marroni, e se poi c'è anche la nebbia non si vede più un caXXo!! by Piero.mac @07/05
scusa io ho appena provato su uno script che ho fatto al momento e non mi fa entrare.!! quella pillola l'ho già letta e infatti curioso sono andato a provare??
Il punto è che non accedo inserendo nemmeno pippo' OR 1=1 -- quindi non capisco se è meno grave del previsto oppure cosa??
Se hai le magic_quote_gpc ad ON gia' queste da sole ti parano il 90% dei tentativi di injection. Tutti i caratteri di controllo usati vengono parsati e quindi diventano innoqui caratteri di testo.
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
apparentemente è meno grave di quanto può sembrare perche di solito nel php.ini hai i magic quotes attivi:
questa impostazione aggiunge un backslash ad alcuni caratteri potenzialmente dannosi come l'apice o le virgolette, rendendo inutili alcuni tentativi di attacco.codice:magic_quotes_gpc = On
ciò non risolve comunque il problema: l'idea alla base di tutto, da applicare sempre e comunque, è che ogni input dell'utente deve essere controllato, filtrato, validato. se i magic quotes vengono per qualsiasi motivo disattivati, non hai piu questa (apparente) protezione.
---
edit:
attenzione che comunque con i magic_quotes o con le funzioni addslashes(), mysql_escape_string() e simili, non tutti i caratteri "pericolosi" vengono preceduti dall'escape, ad esempio il carattere % che si può utilizzare con le query LIKE
Tutti hanno bisogno di credere in qualcosa.
Io credo che mi farò un'altra birra.
utilizzando md5 per criptare la password i rischi di sql Injection dovrebbero essere uguali a 0...o sbaglio?
"La grandezza dell'uomo si misura in base a quel che cerca e all'insistenza con cui egli resta alla ricerca".
a parte lo specifico caso di una tabella con user/password, le due cose non sono correlate.
potresti avere un link del tipo news.php?id=123, dove $_GET['id'] dovrebbe essere un campo intero e quindi trattato come tale.
sicuramente l'hashing delle password puo essere utile, ma resta il fatto che ogni input va validato e filtrato, solo allora sei (dovresti essere) al sicuro
Tutti hanno bisogno di credere in qualcosa.
Io credo che mi farò un'altra birra.