iniezione sql: virgolette singole o doppie virgolette

3

Qualcuno può spiegarmi perché questo codice:

$sql='select * from admin where user_name="$user" and password="$pass" ' ;  

$re = mysql_query($sql);  

non è vulnerabile (payload: "o 1 = 1--) mentre questo codice:

$sql="select * from admin where user_name='$user' and password='$pass' " ;

$re = mysql_query($sql);

è vulnerabile (payload: 'o 1 = 1--)?

Ho solo alternato virgolette singole con virgolette doppie.
Sistema: FreeBSD 10.2-RELEASE
MySql: mysql Ver 14.14 Distrib 5.6.24, per FreeBSD10.1 (i386) utilizzando wrapper EditLine

Grazie

    
posta Dimopoulos Elias 19.11.2015 - 11:27
fonte

1 risposta

4

In PHP le variabili non si espandono all'interno di virgolette singole (vedi link ) in modo che quando tutta la stringa è inclusa tra virgolette singole, non sarà influenzata dal tuo esempio SQLi. Ciò significa che la seguente dichiarazione verrà inviata al server SQL:

select * from admin where user_name="$user" and password="$pass"

Probabilmente non è quello che ti aspetteresti, perché ti aspettavi che le variabili si espandessero, ad esempio qualcosa del tipo:

select * from admin where user_name="some-user-name" and password="some-password"

Per far espandere le variabili nella stringa devi usare virgolette doppie attorno alla stringa in PHP, come hai fatto nel tuo altro esempio. Ma allora sei vulnerabile a SQLi come hai notato.

Per informazioni su come proteggere adeguatamente da SQLi, consulta link .

    
risposta data 19.11.2015 - 11:45
fonte

Leggi altre domande sui tag