Colección de citas famosas - Colección de máximas - ¿Qué es la inyección SQL y cómo prevenirla?

¿Qué es la inyección SQL y cómo prevenirla?

La inyección SQL consiste en insertar comandos SQL en envíos de formularios web o ingresar nombres de dominio o cadenas de consulta para solicitudes de páginas, lo que en última instancia engaña al servidor para que ejecute comandos SQL maliciosos. Específicamente, es la capacidad de utilizar aplicaciones existentes para inyectar comandos SQL (maliciosos) en el motor de base de datos backend para su ejecución. Puede obtener información sobre un sitio web con vulnerabilidades de seguridad ingresando declaraciones SQL (maliciosas) en un formulario web. que ejecutar sentencias SQL según lo previsto por el diseñador. Por ejemplo, muchos sitios web de cine y televisión anteriores filtraron contraseñas de miembros VIP, principalmente al enviar caracteres de consulta a través de formularios WEB. Dichos formularios son particularmente vulnerables a los ataques de inyección SQL.

Ejemplo de ataque de inyección SQL:

Por ejemplo, en una interfaz de inicio de sesión, se le solicita que ingrese un nombre de usuario y contraseña:

Puede ingresarlos así para iniciar sesión sin una cuenta:

Nombre de usuario: 'o 1 = 1 –

Contraseña:

Haga clic para iniciar sesión. Si no se realiza ningún procesamiento especial, entonces el usuario ilegal iniciará sesión con mucho orgullo. (Por supuesto, las API de bases de datos en algunos idiomas ya han solucionado estos problemas)

¿A qué se debe esto a continuación?:

Teóricamente, el programa de autenticación en segundo plano tendrá la siguiente declaración SQL:

String sql = "select * from user_table donde nombre de usuario=

' " nombre de usuario " ' and contraseña=' " contraseña " '";

Cuando se ingresan el nombre de usuario y la contraseña anteriores, la declaración SQL anterior se convierte en:

SELECT * FROM user_table WHERE nombre de usuario=

''o 1 = 1 -- y contraseña=' '

Analice la declaración SQL:

Después de la condición nombre de usuario="o 1=1 nombre de usuario es igual" o 1=1, esta condición definitivamente tiene éxito;

Luego agregue dos - al final, lo que significa comentarios. Comentará las siguientes declaraciones para que no funcionen. De esta manera, las declaraciones siempre se ejecutarán correctamente y. El usuario puede engañar fácilmente al sistema y obtener una identidad legal.

Esto es relativamente suave, si se ejecuta

SELECT * FROM user_table WHERE

username=''; DROP DATABASE (Nombre de base de datos) --' y contraseña=''

….Las consecuencias se pueden imaginar...

Evitar la inyección SQL:

Ahora hablaré de las contramedidas para JSP:

p>

1. (Método simple y efectivo) PreparedStatement

utiliza un conjunto de declaraciones precompiladas, que tiene la capacidad incorporada para manejar la inyección SQL. Simplemente use su método setXXX para. pasar un valor.

Beneficios de su uso:

(1). Legibilidad y mantenimiento del código.

(2).PreparedStatement mejora el rendimiento tanto como sea posible.

(3) El punto más importante es que mejora enormemente la seguridad.

Principio:

La inyección SQL solo afecta el proceso de preparación (compilación) de las declaraciones SQL. efecto destructivo

Pero la PreparedStatement se ha preparado en la fase de ejecución solo procesa la cadena de entrada como datos,

y ya no analiza ni prepara la declaración SQL, por lo que se evita. problema de inyección.

2. Utilice expresiones regulares para filtrar los parámetros entrantes

Paquete a importar:

importar java.util.regex.*; >

Expresión regular:

Cadena privada CHECKSQL = “^(. )\\sand\\s(. )|(. )\\sor(. )\\s$ ";

Determine si coincide:

Pattern.matches(CHECKSQL, targerStr);

La siguiente es la expresión regular específica:

Expresión regular para detectar metacaracteres SQL:

/(\27)|(\')|(\-\-)|(\23)|(#)/ix

Reparar la expresión regular 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

Detectar inyección SQL, expresión regular de la palabra clave de consulta UNION: /((\27)|(\' ))union/ix(\27 )|(\')

Expresión regular para detectar ataques de inyección SQL de MS SQL Server:

/exec(\s|\ ) (s |x)p\w /ix

Espera...

3. Filtrado de cadenas

Un método más común:

(Los parámetros entre || se pueden agregar según a las necesidades de su propio programa) public?static?boolean?sql_inj(String?str)

{

String?inj_str?= "'|and|exec|insert| seleccionar|eliminar|actualizar|

cuenta|*||chr|mid|master|truncar|char|declarar|;|o|-| |,";

Cadena?inj_stra []?=?split(inj_str,"|");

for?(int?i=0?;?i?amp;lt;?inj_stra. length?;?i?)

{

if?(str.indexOf(inj_stra[i])>=0)

{

return?true;

}

}

retorno?falso;

}