example4.php? Id = id = 2-1
Mi sono imbattuto nella suddetta iniezione e non riesco a capire perché (come) funziona e ciò che è interessante è che restituisce tutti i record dal database.
Qualcosa ragazzi? educami
Grazie
Esegue la query WHERE id=id
. Poiché id
è solo un'altra colonna e in SQL puoi semplicemente passare il nome della colonna quando esegui operazioni di confronto.
Si sta dicendo di recuperare tutte le righe WHERE id
della riga uguale a id
della stessa riga, che è vero per tutte le righe.
Questo è uguale a WHERE 1=1
, in pratica altera WHERE
istruzione in modo tale che sia sempre true.
Il frammento iniettato probabilmente genera una query simile a questa:
… WHERE id=id=2-1
Poiché MySQL viene analizzato da sinistra a destra, quanto sopra è equivalente a:
… WHERE (id=id)=2-1
Quindi l'espressione id=id
viene valutata per prima e restituisce 1
(% co_de valore%) per ogni riga come qualsiasi valore non- TRUE
equivale a se stesso quando si utilizza NULL
operazione . Quindi può essere semplificato in:
… WHERE 1=2-1
Che, ovviamente, può essere semplificato in:
… WHERE 1=1
E questo, di nuovo, è vero per ogni riga con un valore% non=
NULL
.
Per quanto riguarda il titolo: è un comune fraintendimento che il passaggio di un valore di input attraverso la funzione id
lo rende automaticamente sicuro da utilizzare in una dichiarazione SQL . Anche il manuale PHP afferma che è ambiguo:
This function must always (with few exceptions) be used to make data safe before sending a query to MySQL.
Tuttavia, ciò che manca al manuale è che i valori passati attraverso mysql_real_escape_string
devono essere usati solo in MySQL stringhe letterali e da nessun'altra parte. Sfortunatamente, il manuale manca di chiarire quell'aspetto importante.
Il risultato è che mysql_real_escape_string
viene anche utilizzato per dati che non sono intesi come valori letterali stringa. Come un diverso valore letterale , un parola chiave , o anche come identificativo colonna o tabella .
Allo stesso modo, nel caso discusso sopra, il valore di input non è usato in una stringa letterale, quindi mysql_real_escape_string
non aiuterà. Tuttavia, una dichiarazione preparata, in cui l'input sarebbe passato come parametro, avrebbe aiutato.
Leggi altre domande sui tag sql-injection web-application