tutorial true test query prevent injection asp c# sql sql-injection

c# - true - Inyección SQL en INSERT



sql injection test (8)

Creé una pequeña página web de encuestas en la Intranet de nuestra compañía. Esta página web no es accesible desde el exterior.

El formulario es simplemente un par de botones de opción y un cuadro de comentarios.

Me gustaría mantener buenas prácticas de codificación y me gustaría protegerme contra las inyecciones de SQL.

¿Pueden las inyecciones de SQL ocurrir en una declaración de inserción con comentarios del cuadro de texto? Si es así, ¿cómo puedo protegerme contra esto usando .NET 2.0?


Además de usar sentencias y parámetros preparados en lugar de concatenar cadenas en su SQL, también debe hacer lo siguiente:

  1. Valide y formatee la entrada del usuario en el lado del servidor. La validación y los límites del lado del cliente pueden pasarse fácilmente por alto con herramientas como WebScarab, o al suplantar su formulario.

  2. Configure los permisos apropiados para la cuenta de usuario de la base de datos. La aplicación web debe usar una cuenta o función separada en su base de datos con permisos restringidos solo a las tablas, vistas y procedimientos necesarios para ejecutar su aplicación. Asegúrese de que el usuario no tenga derechos selectos en las tablas del sistema

  3. Oculte los mensajes de error detallados de los usuarios y use nombres menos comunes para sus objetos. Me sorprende la frecuencia con la que puede determinar el tipo de servidor (oracle, mysql, sqlserver) y encontrar información básica del esquema en un mensaje de error y luego obtener información de tablas llamadas ''usuario (s)'', ''empleado (s)''. Si no ha configurado sus permisos como en (2) y puedo determinar su tipo de servidor, está abierto a declaraciones como esta para SQL Server.

    SELECCIONAR table_name FROM information_schema.table

    EJECUTAR sp_help foundTableName


La forma más fácil de protegerse contra esa forma de inyección de SQL es usar parámetros y procedimientos almacenados en lugar de crear sentencias SQL para ejecutar. (En C # o internamente en SQL Server).

Sin embargo, no estoy del todo seguro de que deba dedicar tiempo a esto, a menos, por supuesto, que sea su política corporativa, ya que las posibilidades de que ocurra internamente son mínimas en el mejor de los casos, y si ocurriera, espero que sepa de inmediato quién es.


La inyección SQL puede ocurrir cada vez que pasa una consulta a la base de datos. Aquí hay una demostración simple:

Inyección de SQL explicada

La clave, dentro de .NET, es hacer lo que Dave Webb ha dado. Evitará el intento de inyección al abarcar toda la cadena como un parámetro a enviar, manejando todos los caracteres que puedan ser interpretados por SQL Server para cambiar la consulta o anexar comandos adicionales.

Y debe señalarse que la inyección SQL puede ocurrir en cualquier aplicación, no solo en aplicaciones web. Y que un ataque interno suele ser el más costoso para una organización. Uno no puede asumir con seguridad que un ataque no se originará desde adentro.


La inyección puede ocurrir en cualquier instrucción SQL que no se ejecute correctamente.

Por ejemplo, imaginemos que su tabla de comentarios tiene dos campos, una ID de entero y la cadena de comentario. Entonces INSERT siguiente manera:

INSERT INTO COMMENTS VALUES(122,''I like this website'');

Considere a alguien ingresando el siguiente comentario:

''); DELETE FROM users; --

Si simplemente pone la cadena de comentarios en el SQL sin procesar, esto podría convertir su único INSERT en las siguientes dos declaraciones seguidas de un comentario:

INSERT INTO COMMENTS VALUES(123,''''); DELETE FROM users; -- '');

Esto eliminaría todo de su tabla de users . Y hay personas dispuestas a pasar todo el día encontrando el nombre de tabla correcto para vaciar usando prueba y error y varios trucos. Aquí hay una descripción de cómo podría realizar un ataque de inyección SQL.

Necesita usar declaraciones SQL parametrizadas para evitar esto.

Y esto no es solo por razones de seguridad. Por ejemplo, si está creando sus declaraciones SQL ingenuamente, haga el siguiente comentario:

I''m just loving this website

causaría un error de sintaxis SQL debido a que el apóstrofo interpretado por SQL es una cita de cierre.


Prevenga la Inyección de SQL utilizando una declaración preparada. El uso de placehoder (?) Elimina por completo la vulnerabilidad de inyección de sql. ejemplo String sql = Seleccione * de user_table donde username = ''+ request.getparameter ("username") +''; statement.executeQuery (sql);

la declaración anterior es vulnerable a la inyección sql.

Para que sea seguro contra la inyección sql. Úselo siguiendo el fragmento

String sql = Seleccione * de user_table donde username = ?; statement.setString (1, nombre de usuario);


Sí puede. Digamos que el cliente envía esto:

OR 1 = 1

Eso puede ser muy doloroso para su

SELECT * FROM admin WHERE name = @name AND password = @password

Puedes evitar esto con


Sí, pueden suceder. La forma más fácil de evitar esto es usar declaraciones preparadas en lugar de construir el SQL manualmente.

Entonces, en lugar de esto:

String sql = String.Format("INSERT INTO mytable (text_column) VALUES ( ''{0}'' )", myTextBox.Text); // Unsafe!

Harías algo como esto:

String sql = "INSERT INTO mytable (text_column) VALUES ( ? )"; // Much safer

A continuación, agregue el texto del cuadro de texto como un parámetro a su DbCommand que hará que se escape automáticamente y reemplace el "?" en el SQL.


Use consultas parametrizadas para que el texto se cite automáticamente.

SqlCommand command = connection.CreateCommand(); command.CommandText = "insert into dbo.Table (val1,val2,txt) values (@val1,@val2,@txt)"; command.AddParameterWithValue( "val1", value1 ); command.AddParameterWithValue( "val2", value2 ); command.AddParameterWithValue( "txt", text ); ...