Inyección de código SQLLa inyección SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario. Este tipo de errores puede permitir a usuarios malintencionados acceder a datosa los que de otro modo no tendrían acceso y, en el peor de los casos,modificar el comportamiento de nuestras aplicaciones. Vamos a ver con un ejemplo que significa esode “Inyección de código”: Supongamos que tenemos una aplicación Web (realizada en ASP por sencillez)en la que el acceso a ciertas secciones está restringido. Para restringirese acceso creamos una tabla de usuarios y contraseñas y sólolos usuarios que se validen contra esa tabla podrán acceder a esos contenidos. Una manera de que los usuarios se validen será colocar un par de cuadrosde texto en nuestra página Web (por ejemplo txt. Usuario y txt. Password)donde puedan introducir su nombre y su contraseña y enviar ese par usuario/contraseñaa la base de datos para comprobar si es válido.Primero creamos la tabla que vamos a usary la rellenamos con datos: use web- - Nuestra base de datos se llama webgo- - Creamos una tabla para almacenar los pares usuario/contraseñacreate table usuarios (Usuario varchar (5.Password varchar (5.Introducimos un par de datos de pruebainsert into usuarios (Usuario, Password) values ('Admin', '1. . Usuario, Password) values ('Usuario', 'abcd'). Ahora veamos el código de las páginasque forman parte del proceso de login. Nombre: < input type="text" name="txt. Usuario"> < br> Password: < input type="password" name="txt. Password"> < br> < input type="submit"> < /form>. Esta primera página es sencilla. Simplementelos dos cuadros de texto mencionados que enviarán los datos a la página de login. Login. asp< %Dim Usuario, Password, RS, SSQLUsuario = Request. Form("txt. Usuario")Password = Request. Form("txt. Password")SSQL = "SELECT count(*) FROM Usuarios WHERE Usuario = '" &. Usuario & "' AND password='" & Password & "'"Set RS = Server. Create. Object("ADODB. Recordset")RS. Open SSQL, "Cadena de conexion"If (RS. EOF) Then. Response. Write "Acceso denegado."Else. Response. Write "Te has identificado como " & RS("Usuario")End If. Set RS = Nothing%> Y en esta segunda página creamos dinámicamenteuna sentencia SQL que enviamos a la base de datos para la validación. Si el usuario escribe Admin y 1. SELECT Count(*) FROM Usuarios WHERE Usuario=’Admin’ AND. Password=’1. 23. 4’” Y como esta sentencia nos devuelve un registro,dejaremos que el usuario entre en la Web. Si el usuario escribe por ejemplo‘Admin’ y de contraseña cualquier otra cosa, la sentencia no nos devolverá registrosy no permitiremos entrar a esa persona. Pero ¿qué ocurre si el usuarioescribe ‘ or ‘1’=’1 como usuario y lo mismo de contraseña? En este caso la variable Consulta contendrála cadena: "SELECT Count(*) FROM Usuarios WHERE Usuario = '' or '1'='1' AND. Y obviamente esta sentencia nos devuelve registroscon lo que el usuario entrará en nuestra Web sin tener permiso. Pero esto no es lo peor. Lo peor seráque el usuario utilice estos trucos de inyección de SQL para ejecutarcódigo arbitrario en nuestro servidor. Hablar de Apple computers nos remonta al inicio de la computadora personal, nos hace ver como una empresa ha sido líder en equipo destinado a aplicaciones de. Conocimiento de instrumentos musicales,canto,teatro,animadores, maestro de ceremonias/ Matemáticas,álgebra,cálculo, física/Química,elaboración de productos. Sentencias DDL, cambiar permisos,utilizar procedimientos almacenados y un largo etcétera. Qué ocurriríasi alguien escribiese de contraseña cosas como: ' exec master. ADD' –Como evitarlo: Y ahora lo más importante, ¿quépodemos hacer para evitar estos errores? Pues hay varios sistemas para evitarlo.Por ejemplo podemos filtrar las entradasde los usuarios reemplazando la aparición de ‘ por ‘’(dos comillas simples) e incluso evitando que los usuarios puedan pasar caracterescomo \ / “ ‘ o cualquier otro que se nos ocurra que puede causarproblemas.Estos filtros pueden ser tan sencillos como utilizar la sentenciareplace de Visual Basic: SSQL= "SELECT count(*) FROM Usuarios WHERE Usuario = '" & Replacetxt.Usuario. Text, "'", "''") & "' AND password='" & Replace(txt.Password. Text, "'", "''") & "'"Otro factor importante en cuanto a la seguridades limitar al máximo los permisos del usuario que ejecuta estas sentenciaspara evitar posibles problemas.Por ejemplo utilizando un usuario distinto paralas sentencias SELECT, DELETE, UPDATE y asegurándonos que cada ejecuciónde una sentencia ejecute una sentencia del tipo permitido. more. Por supuesto utilizar el usuario ‘sa’o uno que pertenezca al rol ‘db_owner’ para ejecutar las sentenciasde uso habitual de la base de datos debería quedar descartado. . Una solución definitiva sería trabajar con procedimientos almacenados.El modo en el que se pasan los parámetros a los procedimientos almacenadosevita que la inyección SQL pueda ser usada.Por ejemplo utilizando elsiguiente procedimiento almacenado: También deberíamos validar losdatos que introduce el usuario teniendo en cuenta por ejemplo la longitud delos campos y el tipo de datos aceptados. Esto lo podemos hacer en el clientecon los Regular. Expression. Validator o con los Custom. Validators del VB. NET. Detodos modos si la seguridad es importante todas estas validaciones hay que repetirlasen el servidor. Por ultimo, y ya que estamos pensando en entornos. Web, podemos programar en ASP. NET y utilizar siempre que sea posible las clases. System. Web. Security. Forms. Authentication para que los usuarios entren en nuestrasaplicaciones Web.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
October 2017
Categories |