Scrivi questo:
$sql = "SELECT id_user, name FROM 'TAB_USER' WHERE user = '$username'
^^^^^^^^^
SQL injection is here
Il malvagio invierà come "username" qualcosa che, dopo la sostituzione, renderà il tuo comando SQL simile a questo:
SELECT id_user, name FROM 'TAB_USER' WHERE user = 'Admin'; -- (some stuff here)
vale a dire. l'autore dell'attacco imposterà il "nome utente" alla stringa: Admin'; --
Vedi il carattere di citazione nifty? Questa è la leva per l'attacco. Poiché il codice sostituisce brutalmente $username
nel comando SQL, con "qualunque sia il client fornito", il client può fornire un carattere di virgoletta di chiusura, che termina la costante di stringa, quindi un punto e virgola, che termina il comando, quindi un --
che dice al database "tutto il resto sulla linea è un commento, basta ignorarlo". E ignoralo come fa il database!
Ciò consente al malintenzionato di accedere come amministratore indipendentemente dalla password che ha usato. Questa è Iniezione SQL da manuale . Si prega di prendere nota: si potrebbe essere tentati di concludere che i problemi derivano dal carattere "citazione", e semplicemente il filtraggio sarebbe sufficiente per evitare l'attacco. Non è così. Ci sono molti (molti) modi per abusare di un brutale sostituto come quello che fai, ed è molto difficile catturarli tutti; come Pokemon, ogni nuova versione del software di database SQL introduce nuove specie. Le persone hanno cercato di pensare all'iniezione SQL come a un problema di "escape problematiche"; quindi hanno progettato questa funzione . Quindi hanno riprovati . E ancora ha fallito. Solo la tristezza ti aspetta su questa strada; non camminarlo Non aspettare un mysql_really_escape_string_this_time_i_said_please()
. Invece, utilizza istruzioni preparate .