1. ¿Qué es la inyección SQL? La llamada inyección SQL consiste en insertar comandos SQL en el formulario para enviar o introducir la cadena de consulta del nombre de dominio o la solicitud de página, y finalmente engañar al servidor para que ejecute algunos comandos SQL maliciosos. Al enviar parámetros para construir sentencias SQL ingeniosas, puedes obtener con éxito los datos deseados.
2. SQL tipo de inyección Específicamente, la inyección SQL puede dividirse en cinco categorías: inyección de números, inyección de caracteres, inyección de búsqueda (como), inyección en la inyección y inyección de conexión de oraciones. Desde el punto de vista de la aplicación, se debe prestar especial atención a la inyección SQL en IP, búsqueda, eliminación por lotes y transferencia de base de datos a base de datos.
3. Cómo inyectarse
Veamos un ejemplo típico
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ Nombre de usuario + "' Y contraseña de usuario = '" + Contraseña + "'", conn); Como no hay validación para UserName y Password, si UserName="admin' OR 1=1--" La sentencia SQL ejecutada se convierte en:
SELECCIONA * DE PE_USERS DONDE UserName='admin' O 1=1—' Y UserPassword='' Esto da lugar a la inyección de SQL, y las condiciones siempre son válidas, por lo que puedes iniciar sesión con éxito sin contraseña.
4. Cómo prevenir la inyección SQL
1. Filtrar o convertir cadenas sospechosas
Se evita la inyección SQL escribiendo funciones que filtran o convierten cadenas peligrosas, y luego usan GLOBAL.ASAX o reescriben instancias de contexto
Aquí tienes un ejemplo
bool estático público SqlFilter2(cadena InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 devuelve false; 6 de Foreach (cadena I en Word). Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 retornan verdadero; 11 } 12 } 13 devuelve falso; 14 }
2. Global.asax
Vacío protegido Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Recorriendo los parámetros del Post, excepto para dominios ocultos 4 de la hoja (la cadena i en esto). Request.Form) 5 { 6 si(i=="__VIEWSTATE")continúan; 7 esto.goErr(esto). Request.Form.ToString()); 8 } 9 // Recorre el parámetro Get. 10 de foraje (la cadena i en esto). Request.QueryString) 11 { 12 esto.goErr(esto). Request.QueryString.ToString()); 13 } 14 } vacío privado goErr(string tm) 2 { 3 if(WLCW. Extend.CValidity.SqlFilter2(tm)) 4 esto. Response.end() 5 } Ventajas: Este aspecto es utilizado por la mayoría de los programadores principiantes para evitar la inyección de SQL, y parece funcionar bien para evitar la inyección en la mayoría de los casos.
Desventajas: 1. Filtrará algunos caracteres que no se usaron originalmente para inyecciones, causando problemas inesperados. Por ejemplo, si el nombre de un miembro del foro contiene los mismos caracteres que los caracteres filtrados, esto causará algunos problemas y dificultades inesperadas.
2. Se requiere filtrado o conversión cada vez, lo que reduce la eficiencia del programa
2. Utilizar procedimientos almacenados para consultas paramétricas
El principal propósito de la inyección SQL es ejecutar comandos maliciosos en la base de datos enviando código SQL malicioso. Por lo tanto, mientras los comandos SQL se procesen antes de su ejecución, la inyección SQL puede evitarse eficazmente. Las consultas parametrizadas pueden prevenir eficazmente la inyección SQL.
Ejemplo
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parámetros parms = nuevos Parameters ("@UserName", DbType.String, usuarioName); Existe un parámetro @UserName arriba, usando el objeto Prarmeter, a través del cual el parámetro se añade al objeto Comando, Esto te da una consulta parametrizada. Como se ha descrito anteriormente, ADO.NET envía la siguiente instrucción SQL a SQL Server:
Exec sp_executesql N 'select * de [pe_users] donde username=@username ',N '@username nvarchar(20) ',@username=N 'nombre' SQL Server reemplaza @username por la cadena "name" antes de ejecutar la consulta. Supongamos que tienes las siguientes entradas:
'unión select @@version, null, null— La sentencia SQL generada se ve así:
Exec sp_executesql N 'select * de [pe_users] donde username=@username ',N '@username nvarchar(20) ',@username=N ''' unión selección @@version,null,null--' Puedes ver que ADO.NET escapa de la entrada.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Copiar código
DbTye o SqlDbType pueden ser una variedad de tipos de datos. Puedes elegir según tu tipo de datos. En algunos lugares, también puede usarse para especificar la longitud del parámetro: int size. Esto también previene eficazmente los desbordamientos de bases de datos y las notas SQL Posibilidad de participar. Ventajas: Previene eficazmente la inyección SQL. Desventajas: Algunos lugares no pueden aplicarse, como en.
3. Lista blanca
Descripción: Algunos rangos de parámetros conocidos pueden gestionarse en forma de listas blancas, lo que puede evitar la inyección y consultas SQL Incorrecto, por ejemplo: ordenar por + nombre de columna, cuando el nombre de la columna se pasa en forma de parámetro, se puede formular una lista blanca para juzgar primero el parámetro si el número está en la lista blanca, y luego consulta, de lo contrario se procesará incorrectamente. Ventajas: seguro y fiable Desventajas: Pequeña gama de aplicaciones |