Consulte el ejemplo de código en esta página: Base de datos Java y Swing: Base de datos Swing Applet
El código está plagado de vulnerabilidades de inyección SQL. Cada vez que la aplicación toma información de los campos de formulario Swing y copia esa entrada textualmente en las cadenas de las instrucciones SQL, es una vulnerabilidad. Por ejemplo:
Sentencia de declaración = connection.createStatement (); int i = declaración .executeUpdate ("INSERTAR EN VALORES acc_acc (" + accountIDText.getText () + "," + "'" + usernameText.getText () + "'," + "'" + passwordText.getText () + "'," + "0" + "," + "ahora ())");
¿Qué sucede si el usuario ingresa una contraseña que contiene un apóstrofe? El SQL resultante tendrá un error de sintaxis porque los delimitadores de cadena de comillas simples estarán desequilibrados. Este no es un ataque malicioso: alentamos a las personas a usar símbolos de puntuación en sus contraseñas.
- Hackers: Sin ningún software, ¿cómo saber si su sistema está siendo pirateado?
- ¿Estudiar para CCNA (sin estar necesariamente certificado) me ayudará a convertirme en un hábil hacker ético?
- ¿Cuál es una buena estrategia mental para generar contraseñas seguras y memorables para cuentas familiares compartidas sin un servicio de terceros?
- ¿Cuál es el mejor libro de piratería de todos los tiempos?
- ¿Cómo pueden las computadoras entender el código? ¿Cómo es que el compilador puede entender el lenguaje, de alguna manera ponerlo en binario para ser entendido, y en realidad ser entendido por la máquina misma? Quizás haya algo de información errónea en mi pregunta, pero entiendes lo esencial. ¡Gracias!
La forma de defenderse contra la inyección SQL en una aplicación Swing es la misma que defenderse contra la inyección SQL en cualquier otro tipo de aplicación:
Utilice declaraciones preparadas con parámetros de consulta en lugar de interpolar variables de aplicación en cadenas SQL.
Cadena insertSql = "INSERTAR EN LOS VALORES acc_acc (?,?,?, 0, NOW ())"; Sentencia de instrucción = connection.prepareStatement (insertSql); Statement.setString (1, accountIDText.getText ()); Statement.setString (2, usernameText.getText ()); Statement.setString (3, passwordText.getText ()); Statement.executeUpdate ();
Además de resolver las vulnerabilidades de inyección SQL, esto también hace que el código sea más fácil de escribir y más fácil de leer.
- La
INSERT
SQLINSERT
está en una sola línea, por lo que puede leerla más fácilmente. - No más esfuerzos forzados para tratar de hacer todas esas comas y citas anidadas correctamente.
- Los captadores de campo de formulario Swing están separados de la línea con la consulta SQL.
Tenga en cuenta que los parámetros de consulta SQL solo toman el lugar de los valores en la sintaxis SQL. Es decir, donde pondría un número literal o una cadena o fecha literal entre comillas simples en el SQL. No puede utilizar parámetros de consulta para nombres de tablas o columnas o palabras clave SQL.