< /form >
dopo aver premuto invio dei dati immessi viene quindi inviato alla pagina di userlogin.php che riceve e gestisce attraverso una query sul database per controllare il livello di accesso utente è e se ha inserito il nome utente e la password corretti .
< ? $ username = $ _POST [ 'username' ] ; $ password = $ _POST [ 'password' ] ; $ query = "SELECT username, password FROM utenti WHERE username = ' $ username' e la password = ' $ password' " ; ? >
Questo tipo di modulo di login è aperta allo sfruttamento da attacchi di iniezione di MySQL . Per accedere al sito ogni utente può inserire il seguente codice: 'OR 1 = 1 - per il nome utente e ' OR 1 = 1 per la password
Query sarà ora simile a questa : $ query = "username SELECT. , password FROM utenti WHERE username = '' OR1 = 1 - ' e password = '' OR 1 = 1 " ;
Questa query selezionerà username e password da parte degli utenti , dove non esistono nomi utente o password ( '' parte) o se uno è uguale a uno. Come uno è uguale in tutti i casi una sicurezza del database è compromessa . Due trattini prima apostrofo sono stati aggiunti per rendere MySQL ignorare apostrofo che è ormai superfluo . Questo è solo un tipo di attacco con iniezione di MySQL . Un'altra variante di questo attacco è quello di GetAccess a più informazioni che all'utente è consentito .
Ora guarda un esempio in cui il proprietario del database utilizza seguente queryto ottenere i dati per la visualizzazione su account utente pagina info .
$ query = "SELECT * FROM utenti WHERE username = ' $ name' " ;
Se questo tipo di ricerca non è protetto utente malintenzionato è in grado di input'OR 1 = 1 - per bypassare verificare nome utente. $ query = "SELECT * FROM utenti WHERE username = '' OR 1 = 1 - '" , . Questa query ora non selezionare solo i dati degli utenti , ma i dati di tutti gli utenti nella tabella " utenti"
Protezione contro MySQL iniezioni
Ci sono molti modi per proteggere contro MySQL iniezioni . In realtà le iniezioni di MySQL sono minacce solo se lo sviluppatore ha ignorato la minaccia e non è riuscito a proteggere il suo codice . Il modo più semplice per proteggere le iniezioni in combinazione PHP e MySQL è quello di utilizzare la funzione PHP : " mysql_real_escape_string "
Tornando al primo esempio < $ username = $ _POST [ 'username' ] ; $ . . ? password = $ _POST [ 'password' ] ; $ query = "SELECT username, password FROM utenti WHERE username = ' $ username' e la password = ' $ password' " ; ? >
per proteggere da MySQL iniezioni usi diretti di input utente devono befiltered attraverso " mysql_real_escape_string " . Funzione " mysql_real_escape_string " sfuggirà tutte MySQL caratteri speciali eliminando la possibilità di modificare il comportamento della nostra query
< $ username = mysql_real_escape_string ( $ _POST [ 'username' ] ) . ? $ Password = mysql_real_escape_string ( $ _POST [ ,"'password' ] ) ; $ query = "SELECT username, password FROM utenti WHERE username = ' $ username' e la password = ' $ password' " ; ? >