Come istruzione di query standard internazionale per database, le istruzioni SQL sono state ampiamente utilizzate in vari ambienti di programmazione. Essendo un sistema maturo e stabile, la verifica dell'accesso e della password dell'utente sono essenziali. Nel mio lavoro quotidiano di programmazione, ho scoperto che molti programmatori usano istruzioni SQL per verificare le password degli utenti tramite un'affermazione come questa:
sql="Select * dalla tabella utente dove nome='"+nome+"' e password='"+password+"'"
Il nome e la password sono i nomi utente e le password inseriti dall'utente, e le affermazioni sopra vengono eseguite per verificare se l'utente e la password siano legittime e valide. Tuttavia, attraverso l'analisi, si può trovare che ci sono falle fatali nelle affermazioni sopra elencate. Quando inseriamo la seguente stringa nel nome utente: 111'o'1=1, e poi inseriamo la password in modo casuale, la impostiamo su aaaa. Dopo che la variabile è stata sostituita, l'istruzione SQL diventa la seguente stringa:
sql="Select * dalla tabella utente dove nome='111'o'1=1' e password='aaaa'
Sappiamo tutti che quando la sentenza select giudica le condizioni della query, ignorerà le seguenti operazioni e (e) quando si incontrano operazioni o (o), e il valore di 1=1 nell'istruzione sopra è sempre vero, il che significa che, indipendentemente dal valore inserito nella password, può superare la verifica della password sopra! La soluzione a questo problema è molto semplice e ci sono molti metodi; il più comunemente usato è giudicare la legittimità dell'utente e la password inserita dall'utente prima di effettuare la verifica, e caratteri speciali come virgolette singole e uguali non sono permessi.
I problemi sopra descritti, anche se possono sembrare semplici, esistono. Ad esempio, la prima versione del famoso gioco online "Smiling Proud Jianghu" su Internet aveva un problema simile, e l'autore analizzò con attenzione alcuni dei programmi che aveva già scritto dopo aver letto il rapporto sulle vulnerabilità su questo gioco, e vi furono molte falle di questo tipo. Questa dovrebbe davvero essere la nostra attenzione. Questo mette anche in luce la mancanza di esperienza nella programmazione e la consapevolezza della sicurezza dei giovani programmatori, incluso l'autore. Allo stesso tempo, ci ricorda anche che i programmatori dovrebbero considerare pienamente la sicurezza del programma nella progettazione, e non dovrebbero essere negligenti, e una semplice omissione apparentemente piccola potrebbe causare conseguenze gravi.
|