¿Qué es la inyección SQL y cómo prevenirla?
La inyección SQL se refiere a insertar comandos SQL en el formulario web enviado o en la cadena de consulta del nombre de dominio de entrada o solicitud de página, logrando en última instancia el propósito de inducir al servidor a ejecutar comandos SQL maliciosos. Específicamente, las aplicaciones existentes se utilizan para inyectar comandos SQL (maliciosos) en el motor de base de datos back-end para su ejecución. Esto se puede lograr ingresando declaraciones SQL (maliciosas) en un formulario web para obtener la base de datos del sitio web con vulnerabilidades de seguridad, en lugar de hacerlo como tal. diseñado. La intención del autor es ejecutar la declaración SQL. Por ejemplo, en el pasado, las contraseñas de membresía VIP de muchos sitios web de películas y televisión se filtraban principalmente al enviar caracteres de consulta a través de formularios WEB, y estos formularios eran particularmente vulnerables a ataques de inyección SQL.
Ejemplos de ataques de inyección SQL:
Por ejemplo, en la interfaz de inicio de sesión, se le solicita que ingrese un nombre de usuario y contraseña:
Al ingresar de esta manera, puede iniciar sesión sin una cuenta:
p>Nombre de usuario: 'o 1 = 1 -
Contraseña:
Haga clic en Iniciar sesión, luego haga clic en "Iniciar sesión". Sin un manejo especial, los usuarios ilegales estarán más que felices de iniciar sesión. (Por supuesto, las API de bases de datos en algunos lenguajes ahora pueden manejar estos problemas)
¿A qué se debe esto? Analicémoslo:
Teóricamente, el programa de autenticación en segundo plano contendrá la siguiente declaración SQL:
String sql = "select * from user_table donde nombre de usuario=
' "+nombredeusuario+" 'y contraseña=' "+ contraseña+" '";
Cuando se ingresan el nombre de usuario y la contraseña anteriores, la declaración SQL anterior se convertirá en:
SELECT * FROM user_table WHERE nombre de usuario=
''o 1 = 1 -- y contraseña=' '
Analice la declaración SQL:
La condición va seguida de nombre de usuario= '' o 1 = 1 Si el nombre de usuario es igual a "o 1 = 1, entonces la condición debe ser válida;
Entonces hay dos -, que son comentarios. Comente los siguientes comentarios de declaración para hacerlos ineficaces Esta declaración siempre se ejecutará correctamente y los usuarios pueden engañar fácilmente al sistema y obtener legitimidad
Si se ejecuta
SELECT * FROM user_table WHERE
<. p>username=''; DROP DATABASE (Nombre de base de datos) --' y contraseña=''...Esta operación sigue siendo muy suave y las consecuencias se pueden imaginar...
Prevenir la inyección de SQL:
Aquí hablaré de varias formas de lidiar con JSP:
1 (Método simple y efectivo) PreparedStatement
Utilice el conjunto de declaraciones de precompilación, que tiene la capacidad incorporada de manejar la inyección SQL, simplemente use su método setXXX para pasar el valor.
Beneficios de usar:
(1). Mantenibilidad
(2).PreparedStatement maximiza el rendimiento
(3).Lo más importante es que mejora enormemente la seguridad p>Principio:
SQL. la inyección solo tiene un efecto destructivo en el proceso de preparación (compilación) de declaraciones SQL
Cuando PreparedStatement está listo, la fase de ejecución solo trata la cadena de entrada como datos, en lugar de analizar y preparar declaraciones SQL, evitando así SQL Problemas de inyección.
.
2. Utilice expresiones regulares para filtrar los parámetros entrantes
Paquetes que deben importarse:
importar java.util.regex.*; >
Expresión regular:
Cadena privada CHECKSQL = "^(. +)\sand\s(.+)|(. +)\s\sor(. +)\s\s$ " ;
Determine si coincide:
Pattern.matched(CHECKSQL,targerStr);
La siguiente es la expresión regular específica:
Expresión regular para detectar metacaracteres SQL:
/((\%27)|(\')|(\-\-)|(\%23)|(#)/ix
Expresión regular corregida para detectar metacaracteres SQL: /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\ -)|( \%3B)|(:))/i
Expresión regular para ataques típicos de inyección SQL: /\w*((\%27)|(\'))(( \%6F)|o |(\%4F))((\%72)|r|(\%52))/ix
Expresión regular para la palabra clave de consulta UNION: /((\%27)|(\') )union/ix(\%27)|(\')
Expresión regular para detectar ataques de inyección SQL en MS SQL Server:
/exec(\s|\+)+ (s|x)p\w+/ix
Esperando....
3. Filtrado de cadenas
Un método más general:
(Los parámetros entre || se pueden agregar según las necesidades del programa)
public?static?boolean?sql_inj(String? str)
{
String?inj? _str?=?"'|y|exec|insert|select|delete|update|
count|* |%|chr|mid|master|truncate|char|declare |;|o|-|+|,";
String?inj_stra[]?=?split(inj_str,"|");
for?i=0?; ?i?<?inj_stra.length?;?i++?)
{
if?(str.indexOf (inj_stra[i])>=0)
{
¿regresar?verdadero;
}
}}
}
¿regresar? falso;
}