jueves, agosto 17, 2006

Una estrategia para evitar SQL Injection

Cuando accesamos a la base de datos buscando información o bien insertando nueva información corremos el riesgo de ser atacados mediante SQL Injection.

¿Por qué o cómo pasa esto?
Cuando un usuario introduce información en los formularios que hemos creado en nuestra página, éste texto es concatenado de algún modo en sentencias SQL para realizar queries. Por ejemplo, cuando un usuario escribe su UserName y su Password formamos una sentencia como esta:
SELECT * FROM Usuarios WHERE UserName='usr1' AND Password='pwd1'
Como vemos, las comillas simples delimitan cadenas en la sentencia.

¿Qué pasaría si el usuario en lugar de escribir [usr1] escribiera ['; DROP--]
La sentencia sería:
SELECT * FROM Usuarios WHERE UserName=''; DROP--' AND Password='pwd1'

Seguramente el usuario verá un error en la aplicación. Pero observemos:
1. El punto y coma provocó finalizar una sentencia
2. Los dos guiones provocan que el texto siguiente sea un simple comentario
3. Drop podría ser utilizado para borrar completamente una tabla.

En fin, no queremos ahondar en este tema, pero sí prevenir este tipo de ataques, así que en el caso de nuestras aplicaciones que corren en Web podemos utilizar dos rutinas. Una de ellas que convierta cualquier texto en código HTML, incluyendo la comilla simple, y sólo así guardar la información en la base de datos. La otra tomará texto de la base de datos, que viene en formato HTML y de ser necesario la decodificará para mostrarla correctamente (en controles textbox principalmente).

Function TextFromBD(ByVal StrText As String, ByVal BlnType As Boolean) As String
'BlnType: (0 - Para mostrar en HTML) (1 - Para mostrar en TextBox)
If BlnType = True Then
StrText = Server.HtmlDecode(StrText)
StrText = Replace(StrText, "&#39", "")
StrText = Replace(StrText, "&#3", "")
StrText = Replace(StrText, "&#lt", "")
StrText = Replace(StrText, "&#l", "")
StrText = Replace(StrText, "&#gt", "")
StrText = Replace(StrText, "&#g", "")
StrText = Replace(StrText, "&#", "")
Else
StrText = Replace(StrText, ControlChars.CrLf, "<br>")
StrText = Replace(StrText, ControlChars.Tab, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
End If
Return StrText
End Function

Function TextToBD(ByVal StrText As String, ByVal IntLeft As String) As String
StrText = Trim(StrText)
StrText = Server.HtmlEncode(StrText)
StrText = Replace(StrText, "'", "&#39;")
StrText = Replace(Replace(StrText, "<", "&lt;"), ">", "&gt;")
If IntLeft > 0 Then StrText = Left(StrText, IntLeft)
Return StrText
End Function

No hay comentarios.: