Quando leggiamo i dati da una form come quella di una login, siamo a rischio di SQL Injection.
L'SQL Injection è una procedura tramite la quale è possibile "iniettare"
del codice SQL in modo illecito.
Esempio
Vediamo un esempio concreto. Supponiamo di avere una tabella Users così fatta:
| Username |
Password |
| user1 |
pass1 |
| user2 |
pass2 |
| user3 |
pass3 |
Ecco la form per il login
<form method="post" action="login.asp">
Username: <input
type="text" name="user"><br />
Password: <input
type="text" name="pwd"><br /><br />
<input
type="submit" value="Submit">
</form>
Autenticazione
Per leggere i parametri:
<%
user = Request.Form("user")
pwd = Request.Form("pwd")
If Not checkUser(user,pwd)
Response.Redirect("nonautorizzato.asp")
Else
'utente autenticato
End If
function checkUser(user,pwd)
'connessione al database...
checkUser = false
SQL = ""
SQL = SQL & "Select * from utenti "
SQL = SQL & " where "
SQL = SQL & " [username]='"
& user & "' and "
SQL = SQL & " [password]='" & pwd & "'"
Res = Connection.Execute(SQL)
If not(Res.Eof) Then
checkUser = true
End If
Res.Close
end function
%>
Ecco che entra in gioco la SQL Injection. se come username e password inseriamo il codice: a' or 'a' = 'a ecco come viene scritta la query che legge l'utente:
select * from utenti
where
[username] ='a' or 'a'='a' and
[password]
='a' or 'a'='a'
Questo perchè il carattere ' viene interpretato da ASP come carattere di fine stringa.
A questo punto risulta chiaro che la query restituisce il recordset completo di tutti gli utenti del database (essendo la where sempre verificata) e ci fa passare...
Come evitare l'SQL Injection
Ci sono diversi metodi per evitare l'SQL Injection, io vi mostro quello più immediato, e comunque di sicuro effetto.
Quando leggiamo i valori dalla querystring, basta sostituire il carattere di ' con due caratteri '' tramite l'istruzione Replace
<%
user = Request.Form("user")
pwd = Request.Form("pwd")
'per prevenire l'sql injection
user = Replace(user,"'","''")
pwd = Replace(user,pwd,"'","''")
%>
Il resto del codice non necessita modifiche.