Como declaración estándar internacional para consultas de bases de datos, las sentencias SQL se han utilizado ampliamente en diversos entornos de programación. Como sistema maduro y estable, la verificación de acceso y contraseña del usuario es esencial. En mi trabajo diario de programación, descubrí que muchos programadores usan sentencias SQL para verificar las contraseñas de usuario mediante una declaración como esta:
sql="Select * de la tabla de usuario donde nombre='"+nombre+"' y contraseña='"+contraseña+"'"
El nombre y la contraseña son los nombres de usuario y contraseñas introducidos por el usuario, y las declaraciones anteriores se ejecutan para verificar si el usuario y la contraseña son legítimos y válidos. Sin embargo, mediante el análisis, se puede encontrar que existen lagunas legales en las afirmaciones anteriores. Cuando introducimos la siguiente cadena en el nombre de usuario: 111'o'1=1, y luego introducimos la contraseña de forma casual, la ponemos en aaaa. Tras reemplazar la variable, la sentencia SQL se convierte en la siguiente cadena:
sql="Select * de la tabla de usuario donde nombre='111'o'1=1' y contraseña='aaaa'
Todos sabemos que cuando la sentencia select juzga las condiciones de consulta, ignorará las siguientes operaciones y (y) al encontrarse con o (o) operaciones, y el valor de 1=1 en la sentencia anterior es siempre cierto, lo que significa que, independientemente del valor que se introduzca en la contraseña, ¡puede pasar la verificación de contraseña anterior! La solución a este problema es muy sencilla, y existen muchos métodos; el más común es juzgar la legitimidad del usuario y la contraseña introducida por el usuario antes de realizar la verificación, y no se permiten caracteres especiales como comillas simples ni signos iguales.
Los problemas anteriores, aunque puedan parecer simples, existen. Por ejemplo, la versión temprana del famoso juego online "Smiling Proud Jianghu" en Internet tenía un problema similar, y el autor también analizó cuidadosamente algunos de los programas que había escrito antes tras leer el informe de vulnerabilidades sobre este juego, y había muchas lagunas de este tipo. Esto debería ser nuestra atención. Esto también pone de manifiesto la falta de experiencia en programación y de conciencia en seguridad de los jóvenes programadores, incluido el autor. Al mismo tiempo, también nos recuerda que los programadores deben tener en cuenta plenamente la seguridad del programa al diseñarlo, y no deben ser descuidados, y una omisión aparentemente pequeña puede tener consecuencias graves.
|