tutorial test sheet net inyección inyeccion injection cheat aspx asp .net asp.net sql security sql-injection

.net - sheet - sql injection test



¿Cómo puedo evitar ataques de inyección SQL en mi aplicación ASP.NET? (16)

Aunque su pregunta es muy genérica, siempre se aplican algunas reglas:

  • Utilice consultas parametrizadas ( SqlCommand con SqlParameter ) y ponga la entrada del usuario en los parámetros.
  • No cree cadenas de SQL de entradas de usuario sin marcar.
  • No suponga que puede crear una rutina de desinfección que pueda verificar la información del usuario para cada tipo de malformación. Las fundas de borde se olvidan fácilmente. Verificar la entrada numérica puede ser lo suficientemente simple como para llevarlo al lado seguro, pero para la entrada de cadena simplemente use los parámetros.
  • Comprobar vulnerabilidades de segundo nivel: no cree cadenas de consulta SQL a partir de los valores de la tabla SQL si estos valores consisten en la entrada del usuario.
  • Use procedimientos almacenados para encapsular las operaciones de la base de datos.

Necesito evitar ser vulnerable a la inyección SQL en mi aplicación ASP.NET. ¿Cómo podría lograr esto?


Intente utilizar procedimientos almacenados y valide la entrada de sus datos. No use ningún SQL directo como INSERT INTO ...


Use declaraciones preparadas (enlace a un tutorial de ASP.NET que usa declaraciones preparadas en la sección ''Agregar nodos para productos''). Eso es todo al respecto.

Bueno, eso o usar un ORM, como Linq to SQL o NHibernate , usan internamente declaraciones preparadas.


Use parámetros! Es realmente así de simple :-)

Cree sus consultas de esta manera (para el servidor MS Sql con C #):

SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn);

Aquí @Name es el parámetro donde desea evitar la inyección de sql y conn es un objeto SqlConnection. Luego, para agregar el valor del parámetro, haga lo siguiente:

getPersons.Parameters.AddWithValue("@Name", theName);

Aquí theName es una variable que contiene el nombre que está buscando.

Ahora debería ser imposible hacer cualquier inyección SQL en esa consulta.

Como es así de simple, no hay razón para no usar parámetros.



Como han dicho otros, no concatenar la entrada del usuario para crear sentencias SQL dinámicas; utilice siempre SQL parametrizado cuando use SQL dinámico. Sin embargo , señalaré que esta regla también se aplica al crear sql dinámico dentro de un proceso almacenado . Este hecho es algo que las personas a menudo pasan por alto. Creen que están a salvo porque están "usando procedimientos almacenados".


Comprenda exactamente qué es SQL Injection y luego nunca escriba nada que sea vulnerable a él.


El libro, "Construyendo Secure ASP.NET Applications" guideline tiene una sección sobre este tema.


NUNCA confíe en la entrada del usuario, siempre valídela y use parámetros sql. Debería ser una base suficiente para evitar la inyección de SQL.


Scott Guthrie publicó un pequeño artículo decente sobre esto hace un tiempo. En él, él ofrece 5 sugerencias para protegerse:

  1. No construya declaraciones SQL dinámicas sin utilizar un mecanismo de codificación de parámetros de tipo seguro. [...]

  2. Siempre realice una revisión de seguridad de su aplicación antes de ponerla en producción, y establezca un proceso de seguridad formal para revisar todo el código cada vez que realice actualizaciones. [...]

  3. Nunca almacene datos confidenciales en texto sin formato dentro de una base de datos. [...]

  4. Asegúrese de escribir pruebas de la unidad de automatización que verifiquen específicamente la capa de acceso a datos y la aplicación contra los ataques de inyección de SQL. [...]

  5. Bloquee su base de datos para que solo otorgue a la aplicación web que accede a ella el conjunto mínimo de permisos que necesita para funcionar. [...]

Él hace un trabajo decente de explicar por qué estos son importantes, y enlaces a muchos otros recursos también ...


Siempre use solo consultas parametrizadas.


Use consultas parametrizadas y / o procedimientos almacenados y analice sus parámetros a través de parámetros de SQL. Nunca genere código SQL concatenando cadenas. También lea un poco sobre la inyección de SQL y sobre la escritura de código seguro, ya que la prevención de la inyección SQL es solo una pequeña parte de la seguridad. Hay muchos más (como XSS - Cross Site Scripting). Si un hacker quiere poner en peligro su sitio / aplicación, buscará más que solo inyección SQL.


Nunca confíe en la entrada del usuario : valide todas las entradas del cuadro de texto usando controles de validación, expresiones regulares, código, etc.

Nunca use SQL dinámico - Use SQL parametrizado o procedimientos almacenados

Nunca se conecte a una base de datos con una cuenta de administrador : use una cuenta de acceso limitado para conectarse a la base de datos

No almacene secretos en texto sin formato : contraseñas cifradas o hash y otros datos confidenciales; también deberías encriptar las cadenas de conexión

Las excepciones deben divulgar información mínima : no revele demasiada información en los mensajes de error; use customErrors para mostrar información mínima en caso de error no controlado; establecer la depuración en falso

Enlace útil en MSDN Stop SQL Injection


Use XSS Secured UrlEncode usando Microsoft.Security.Application.AntiXss.UrlEncode y SQL Injection no funcionará. O puede usar ASP.NET - JSON - Serialización y deserialización

Pruebe también su aplicación con SiteDigger desde Macfee Fre Tool.

Pocos más son de aquí

.NET Security Toolkit v1.0 .NETMon v1.0 Validator.NET v1.0


La inyección SQL ocurre porque la consulta a la base de datos se está construyendo en tiempo real, por ejemplo:

SELECT * From Table1 WHERE " + UserInput

UserInput puede ser malicioso y contener otras declaraciones que no pretendas.

Para evitarlo, debe evitar concatenar su consulta.

Puede lograr esto mediante el uso de consultas parametrizadas; consulte el objeto DBCommand para su particular sabor DB.


Todos dicen "Usar parámetros". Tendríamos que decirlo menos si no fuera tan perversamente difícil.

Use QueryFirst . La tentación de concatenar se elimina, y el camino correcto se convierte en la forma más fácil. Usted crea un parámetro simplemente escribiendo @myParam en su SQL, la herramienta hace el resto.

descargo de responsabilidad: escribí QueryFirst