ıllı Internet y Tecnologías de la Información (2018)

internet, Hosting, dominios, seo, antivirus, banco de imágenes, páginas web, tiendas online

[Enciclopedia Online Gratuita] Diccionario de Internet y Tecnologías de la Información y la Comunicación (TIC):

ıllı Inyección SQL wiki: info, historia y vídeos

videos internet

salud  Inyección SQL 


Inyección SQL es un procedimiento de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para efectuar operaciones sobre una base de datos.


El origen de la vulnerabilidad se encuentra en la incorrecta comprobación o bien filtrado de las variables empleadas en un programa que contiene, o produce, código SQL. Es, en verdad, un fallo de una clase más general de vulnerabilidades que puede suceder en cualquier lenguaje de programación o bien script que esté embebido en otro.


Se conoce como Inyección SQL, de forma indistinta, al género de vulnerabilidad, al procedimiento de infiltración, al hecho de engastar código SQL intruso y a la porción de código engastado.


Se afirma que existe o bien se generó una inyección SQL cuando, de alguna forma, se introduce o bien "inyecta" código SQL invasor en el código SQL programado, a fin de trastocar el funcionamiento normal del programa y conseguir conque se ejecute la porción de código "invasor" engastado, en la base de datos.


Este género de intrusión en general es de carácter malicioso, perjudicial o bien espía, por consiguiente es un inconveniente de seguridad informática, y ha de ser tomado en cuenta por el programador de la aplicación para poder prevenirlo. Un programa elaborado de manera descuidada, displicencia o bien con ignorancia del inconveniente, va a poder resultar ser frágil, y la seguridad del sistema (base de datos) va a poder quedar ocasionalmente comprometida.


La intrusión ocurre a lo largo de la ejecución del programa frágil, así sea, en computadores de escritorio o en sitios Web, en este último caso evidentemente ejecutándose en el servidor que los aloja.


La vulnerabilidad se puede generar de manera automática en el momento en que un programa "arma de forma descuidada" una sentencia SQL en tiempo de ejecución, o a lo largo de la fase de desarrollo, cuando el programador explicita la sentencia SQL a ejecutar en forma desamparada. En todo caso, siempre y cuando el programador necesite y use factores a ingresar por la parte del usuario, a efectos de preguntar una base de datos; puesto que, justamente, en los factores es donde se puede agregar el código SQL intruso.


Al ejecutarse la consulta en la base de datos, el código SQL inyectado asimismo se ejecutará y podría hacer un sinnúmero de cosas, como introducir registros, alterar o bien suprimir datos, autorizar accesos y también, aun, ejecutar otro género de código malicioso en el PC.


Por ejemplo, asumiendo que el próximo código radica en una aplicación web y que hay un factor "nombreUsuario" que contiene el nombre de usuario a preguntar, una inyección SQL se podría provocar de la próxima forma:


El código SQL original y frágil es:

consulta := "SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';"

Si el operador escribe un nombre, por poner un ejemplo "Alicia", nada anormal va a suceder, la aplicación produciría una sentencia SQL afín a la próxima, que es de manera perfecta adecuada, en donde se escogerían todos y cada uno de los registros con el nombre "Alicia" en la base de datos:

SELECT * FROM usuarios WHERE nombre = 'Alicia';

Pero si un operador avieso escribe como nombre de usuario a consultar:

Alicia'; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE ' por ciento

, se produciría la próxima consulta SQL, (el color verde es lo que pretende el programador, el azul es el dato, y el colorado, el código SQL inyectado):

SELECT * FROM usuarios WHERE nombre = 'Alicia';DROP TABLE usuarios;SELECT * FROM datos WHERE nombre LIKE ' por ciento ';

En la base de datos se ejecutaría la consulta en el orden dado, se escogerían todos y cada uno de los registros con el nombre 'Alicia', se borraría la tabla 'usuarios' y por último se elegiría toda la tabla "datos", que no habría de estar libre para los usuarios web comunes.


En resumen, cualquier dato de la base de datos puede quedar libre para ser leído o bien cambiado por un usuario avieso.


Nótese por qué razón tiene por nombre "Inyección" SQL. Si se observa el código malicioso, de color colorado, se apreciará que está insertado en el medio del código bueno, el verde. De esta forma, el código colorado ha sido "inyectado" en el verde.


La inyección SQL es simple de eludir, por la parte del programador, en la mayor parte de los lenguajes de programación que dejan desarrollar aplicaciones web. En la próxima sección se trata escuetamente ese tema.


'Ataque a ciegas por inyección SQL', en inglés, Blind SQL injection, es una técnica de ataque que emplea la inyección SQL. Se patentiza cuando en una web, por un fallo de seguridad, no se muestran mensajes de fallo al no generarse resultados adecuados frente a una consulta a la base de datos, mostrándose siempre y en todo momento exactamente el mismo contenido (esto es, solo hay contestación si el resultado es adecuado).


Sentencias condicionales con el tipo "Or 1=1" o bien "having 1=1" ofrecen contestaciones siempre y en todo momento adecuadas (true o bien auténtico) por lo que acostumbran a ser utilizadas por los programadores como formas de comprobación. El inconveniente para la seguridad de la página se encuentra en que esta técnica es empleada en combinación con diccionarios o bien fuerza salvaje para la busca, carácter por carácter, de una clave de acceso, un nombre de usuario, un número o bien cualquier otra información que albergue la base de datos atacada; para esto se emplea código SQL concreto que "va probando" cada carácter logrando un resultado positivo acumulable cuando hay una coincidencia. Así se puede saber, por poner un ejemplo, que una clave de acceso empieza por "F...", entonces prosigue con ".i...", y después "..r...", etc (amontona Fir...), hasta dar con la palabra completa.


Existen programas que automatizan este proceso de "tanteos" letra por letra en el resultado de la consulta SQL, que un intruso podría mandar inyectado.


Ruby on Rails


En el frameworkRuby on Rails (RoR), las consultas son verificadas de forma automática por cualquiera de los métodos de busca incluidos.Por ejemplo:

Project.findconsulta:="SELECT * FROM usuarios WHERE nombre = '"+nombreUsuario+"';"# o bien bienProject.find(:all,:conditions=>)

La única forma de que un usuario mal intencionado pueda emplear una inyección de SQL en RoR es que a través de código se convierta la variable a tipo string y se utilice como razonamiento de la busca de manera directa. Por ejemplo:

# NO SE DEBERÍA HACER ESTOProject.find(:all,:conditions=>"name = '#'")

En lenguaje Perl DBI, el procedimiento DBI::quote filtra los caracteres singulares (asumiendo que la variable dólares americanos sql contiene una referencia a un objeto DBI):

 dólares americanos query= dólares americanos sql->prepare("SELECT * FROM usuarios WHERE nombre = ". dólares americanos sql->quote( dólares americanos nombre_usuario));

O asimismo se puede emplear la característica placeholder (con comillado automático) como sigue:

 dólares americanos query= dólares americanos sql->prepare("SELECT * FROM usuario WHERE nombre = ?"); dólares americanos query->execute( dólares americanos nombre_usuario);

En el lenguaje PHP, hay diferentes funciones que pueden servir de ayuda para utilizar con diferentes sistemas de administración de bases de datos.



Si se utiliza MySQL, la función a utilizar es mysql_real_escape_string:

 dólares americanos query_result=mysql_query("SELECT * FROM usuarios WHERE nombre = \"".mysql_real_escape_string( dólares americanos nombre_usuario)."\"");

No obstante es más recomendado utilizar opciones alternativas que ofrecen consultas preparadas como la clase PDO.

 dólares americanos statement= dólares americanos pdo->prepare("SELECT * FROM usuarios WHERE nombre = :nombre"); dólares americanos statement->bindParam(':nombre', dólares americanos nombre_usuario); dólares americanos statement->execute(); dólares americanos result= dólares americanos statement->fetch();

Y si se emplea MySQLi...

// Con funciones dólares americanos conexion=mysqli_connect("host","usuario","clave","bdd"); dólares americanos query=mysqli_query( dólares americanos conexion,"SELECT * FROM usuarios WHERE nombre = '".mysqli_real_escape_string( dólares americanos conexion, dólares americanos nombre)."'");// Orientado a objetos heredando la clase: dólares americanos query= dólares americanos this->query("SELECT * FROM usuarios WHERE nombre = '". dólares americanos this->real_escape_string( dólares americanos nombre)."'");// Sin heredar la clase dólares americanos query= dólares americanos this->mysqli->query("SELECT * FROM usuarios WHERE nombre = '". dólares americanos this->mysqli->real_escape_string( dólares americanos nombre)."'");/* donde  dólares americanos this->mysqli es el link mysqli a la base de datos */

En lenguaje Java, se puede emplear la clase PreparedStatement


En sitio de:

Connectioncon=(acquireConnection)Statementstmt=con.createStatement();ResultSetrset=stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '"+nombreUsuario+"';");

se puede emplear parametrización o bien escape de variables, como se señala en los próximos apartados.


Parametrización de sentencias SQL

Connectioncon=(acquireConnection)PreparedStatementpstmt=con.prepareStatement("SELECT * FROM usuarios WHERE nombre = ?");pstmt.setString(1,nombreUsuario);ResultSetrset=pstmt.executeQuery();

Escape de las variables a introducir en la sentencia SQL


Escapar el texto contenido en la variable remplazando los caracteres singulares en SQL por su equivalente textual, de tal manera que SQL interprete todo el contenido de la variable tal y como si fuera texto.

Connectioncon=(acquireConnection)Statementstmt=con.createStatement();ResultSetrset=stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '"+nombreUsuario.replace("\\","\\\\").replace("'","\\'")+"';");

También se puede emplear el procedimiento escapeSQL de la clase proveniente de la librería de Apache Commons Lang

Connectioncon=(acquireConnection)Statementstmt=con.createStatement();ResultSetrset=stmt.executeQuery("SELECT * FROM usuarios WHERE Nombre = '"+StringEscapeUtils.escapeSQL(NombreUsuario)+"';");

En lenguaje C#, de la plataforma .NET (o bien su opción alternativa libre Mono), se tiene ADO.NETSqlCommand (para MicrosoftSQL Server) o bien OracleCommand (para servidores de bases de datos Oracle). El ejemplo siguiente muestra de qué manera prevenir los ataques de inyección de código utilizando el objeto SqlCommand. El código para ADO.NET se programa de forma afín, si bien puede cambiar ligeramente conforme la implementación concreta de cada distribuidor.


En vez de:

using(SqlConnectioncon=(acquireconnection))

se podría utilizar lo siguiente:

using(SqlConnectioncon=(acquireconnection))


  ELIGE TU TEMA DE INTERÉS: 


autoayuda.es   Internet y Tecnologias 

Está aquí: Inicio > [ INTERNET ] > ıllı Inyección SQL wiki: info, historia y vídeos

Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Ver políticas