El documento describe vulnerabilidades de seguridad en un código que realiza el login de usuarios en una base de datos. La concatenación de variables de usuario en la sentencia SQL permite inyecciones maliciosas. Se recomienda usar parámetros y almacenar el procedimiento en la base de datos para fortalecer la validación y prevenir ataques.
4. Dim queryString As String = _ "SELECT * FROM users WHERE username = ‘” & Me.user.text & ”’ AND password = ‘” & Me.pass.text & ”’;“ Using connection As New SqlConnection(connectionString) connection.Open() Dim command As New SqlCommand(queryString, connection) Dim reader As New SqlDataReader = command.ExecuteReader() If reader.Read() then result.text = “Bienvenido ” & reader(0) Else result.text = “No se pudologuear!” End if connection.Close() End Using
5. No hay validación del contenido de la información Los usuarios pueden escribir cualquier cosa!
6. ‘ OR 1 = 1 -- SELECT * FROM usuarios WHERE username = ‘’ OR 1 = 1 --’ AND password = ‘cualquiercosa’;“ ‘; INSERT INTO usuarios VALUES(‘TuUsuario', ‘TuPassword') -- SELECT * FROM usuarios WHERE username = ‘‘; INSERT INTO usuarios VALUES(‘TuUsuario', ‘TuPassword') --’ AND password = ‘cualquiercosa’;“ ‘; DROP TABLE usuarios -- SELECT * FROM usuarios WHERE username = ‘‘; DROP TABLE usuarios -- ’ AND password = ‘cualquiercosa’;“
7. Evitar la concatenación de variables con sentencias SQL Hacer validaciones fuertes y exhaustivas Desconfiar de lo que los usuarios escriben Apoyarse con las herramientas que provee ASP
8. Dimquery As String = “SELECT * FROM usuarios WHERE username = @user AND password = @pass;” … DimuserParameter As New SqlParameter(“@user”, SqlDbType.NVarChar, 25) WithuserParameter .Value = Me.user.text EndWith Command.Parameters.Add(userParameter) ‘mismo procedimiento para @pass …
9. CREATE PROCEDURE dbo.GetLogin( @usernamevarchar(25), @passwordvarchar(25) ) AS SELECT * FROM usuarios WHERE username = @username AND password = @password Dim procedimiento As String = “GetLogin” … Dim command As New SqlCommand(procedimiento, connection) … command.CommandType = CommandType.StoredProcedure