Newsgroup: it.comp.www.php
Titolo: SQL injection in URL query

Dove posso trovare una rapida documentazione a proposito di assalti SQL 
injection su URL query? A scopo didattico (per me, e per una persona che 
sta studiando insieme a me). Italiano o inglese non fa alcuna 
differenza.
In pratica, passare parametri al mysql tramite URL nella forma (per 
esempio):
myscript.php?nomeutente=21
puo' aprire la strada a possibili assalti al database?
Vorrei studiare un po', in breve inizialmente, per poi andare in 
profondita' nell'argomento.
Grazie per l'aiuto! :-)
-- 
Falco Stellare - 
falco.ste...@graphicside.it
<< Togli il TAPPO per rispondermi >>

 profondita' nell'argomento.
Mi pare che questo sia un articolo abbastanza a tema.
Se lo leggi dicci com'e' che magari andiamo a leggercelo pure noi.
Ciao.
	-Ema-

 -Ema-
lo avevo acennato apposta qualche secolo fa propio per eviare il injection
forse lo trovi sul sito di hj

 
Ci sono tanti modi per controllare le variabili,nel tuo caso è facile, 
in quanto valore numerico.
Puoi impostare un cast
$nomeutente= (int) $_GET['nomeutente'];
Al che tutto quello che non è numero diventa un innocuo zero, trattabile 
in una condizione:
if($nomeutente==0) { ..."esci puzzone!" ..oppure "oops! niente da 
vedere"} :-)
Uppure ottieni lo stesso risultato con
$query= sprintf("SELECT * FROM mia_tabella WHERE utente='%d'", 
$_GET['nomeutente']);
dove %d sta per numero intero (anche qui una stringa diventa un innocuo 
zero...)
Come vedi il trattamento dei numeri è particolarmente agevole... dove 
puoi passare numeri puoi ritenerti più sicuro.
Di tutorial te ne puoi leggere tanti, io ne avevo letto qui e lì, ma una 
ricerca base con Google (Tutorial SQL injection ) ti offre già tanto...
Ciao
Marcello

puo' aprire la strada a possibili assalti al database?
Si'. Ci sono quattro soluzioni che io sappia (e sicuramente altre che non
so), quali sono applicabili dipende parametro per parametro.
* Modifichi l'input in modo da renderlo forzatamente innocuo.
  Per esempio: invece che
	SQLExec($conn, "SELECT ... WHERE MD5($password) = cryptpw;");
  usi
	$user = md5($_REQUEST['user']);
	$pass = md5($_REQUEST['pass']);
	SELECT * FROM users WHERE MD5(user) = '$user' AND cryptpw='$pass';
  In questo caso puoi usare per 'user' e 'pass' qualsiasi carattere, anche
  escape o caratteri privilegiati, e funzionera'.
* Modifichi l'input in modo da renderlo SQL valido.
	AddSlashes
	SQLEscape (mysql_escape_string)
	str_replace
* Validi preventivamente il parametro usando ad es. delle regexp
	$allowed = array(
		'user'	=> '^[a-zA-Z_0-9]+$',
		...
		...
	);
	foreach($_REQUEST as $key => $value)
	{
		...
	}
* Confronti il parametro con dei valori e poi lo reinserisci:
	// NO //	$Query="DELETE FROM $_REQUEST[tabella] ..."
	switch($_REQUEST['tabella'])
	{
		case 'vendite':
			$Query = "DELETE FROM vendite ...";
			break;
		case 'ordini':
			if ($ADMINLEVEL > 5)
			{
				...
			}
		...
	}
Il terzo modo e i primi due sono unificabili (volendo, perfino il quarto):
nel terzo modo, dove c'era scritto
	'user'	=> '(regexp)'
mettiamo piu' informazioni
	'user'	=> 'filter|(regexp)|...'
e il filtro viene estratto usando explode('|', ...); dopo di che ad es. il
filtro nullo viene ignorato, se non e' nullo si valida con function_exists
e si utilizza, e quel che avanza viene passato prima o dopo alla regexp.
Un altro vantaggio e' che l'array puo' essere messo in un file .ini che e'
a disposizione dell'utente finale, quando realizzo un sito per terzi.
Questo tipo di "filtraggio", ha anche un grosso vantaggio: si puo' rendere
trasparente. Obblighi i tuoi file a includere sempre "sanitize.php", e nel
file sanitize.php *RISCRIVI* gli array _GET, _POST, ecc., in modo tale che
il loro contenuto sia "pulito".
Questo intervento rende piu' "resistente" un sito vulnerabile, non solo ad
un attacco SQL injection, ma anche PHP injection, tipo quello che potrebbe
venire fuori da una "ottimizzazione" di un messaggio visto di recente
	gqde20p91kjt1u8pc...@L.Serni
(li' si include sempre $_REQUEST['page'].html, il che potrebbe fare venire
la tentazione di scrivere un mortale "include $_REQUEST['page'].'.html'").
Il motivo per cui non ho mai pubblicato il codice del "sanitize paranoico"
e' che lo studio del file .ini e' cruciale, e uno che "non ha tempo" (pare
che la gente non abbia MAI tempo, come il boscaiolo della storiella) e' di
sicuro predestinata a (1) spararsi in un piede, (2) darne la colpa a me.
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 sta studiando insieme a me)
Ciao,
qui trovi sia la trattazione dell'argomento che diversi link
http://freephp.html.it/articoli/view_articolo.asp?id=123
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 
Ho dimenticato di mettere il link!!! 
Era 
http://freephp.html.it/articoli/view_articolo.asp?id=123
Ecco perche' non capivo la risposta di Red :-) . Ero li' che mi chiedevo
cosa stavi dicendo... .
Ciao.
	-Ema-


:Provate a guardare gli ingredienti del famoso Labello che si usa per
:le labbra screpolate: Butirrospermum Parkii (sperma di maiale).

 Ci sono quattro soluzioni che io sappia
Ottimo, ragazzi!
Grazie a tutti per gli ottimi spunti, avro' di che occupare anche quelle 
poche ore che la notte trascorrevo dormendo :-)
E contemporaneamente tornero' a fare esercizi con il linguaggio SQL, che 
a volte mi sembra piu' un modo di pensare, una filosofia logica, che un 
linguaggio ;-) Per me e' un ottimo sensore, quando non ci capisco piu' 
nulla tra JOIN, SELECT, tabelle e degenerazioni, allora vuol dire che 
devo dormire un po'...


 --
Capita anche con i migliori ;-)
Fabio "gestisci un network con gli accessi di 
html.it
 e poi mi racconti"


Fabio "gestisci un network con gli accessi di 
html.it
 e poi mi racconti"
Sovraccarichi ne ho avuti ("Il server e' temporaneamente sovraccarico; si
prega di riprovare piu' tardi. Ci scusiamo dell'inconveniente", con email
di statistiche ogni 15 minuti, e minacce mafiose via SMS :-) ); e' il non
trovare affatto i server e uscire con quell'errore li', che m'e' capitato
raramente.
Comunque, ora funziona e l'articolo e' interessante: grazie :-)
