Antecedentes:Escapar SQL cadenas en Java
Actualmente estoy desarrollando una interfaz Java para una base de datos de CMS Empresa (Business Objects). Por el momento, estoy creando una función para permitir al usuario crear una consulta de base de datos personalizada. Ya he implementado medidas para garantizar que el usuario solo pueda seleccionar utilizando un subconjunto de columnas disponibles y operadores que han sido aprobados para el acceso de los usuarios (por ejemplo, SI_EMAIL_ADDRESS puede seleccionarse mientras que campos más potentes como SI_CUID no pueden ser). Hasta el momento las cosas han estado sucediendo a la perfección, pero ahora es el momento de asegurar esta característica contra los potenciales ataques de inyección SQL.
La Pregunta:
Busco a un método para escapar de las cadenas de entrada de usuario. Ya he visto PerparedStatement, sin embargo, estoy obligado a utilizar API de terceros para acceder a la base de datos. Estas API son inmutables para mí y el acceso directo a la base de datos está fuera de cuestión. Los métodos individuales toman cadenas que representan las consultas que se ejecutarán, invalidando así PreparedStatement (que, que yo sepa, debe ejecutarse contra una conexión de base de datos directa).
He considerado utilizar String.replace(), pero no quiero reinventar la rueda si es posible. Además, estoy muy lejos de los expertos en seguridad que desarrollaron PerparedStatement.
También había mirado la referencia de API de Java para PerparedStatement, con la esperanza de encontrar algún tipo de método toString(). Por desgracia, no he podido encontrar nada por el estilo.
Cualquier ayuda es muy apreciada. Gracias de antemano.
Referencias:
Java - escape string to prevent SQL injection
Java equivalent for PHP's mysql_real_escape_string()
Ese primer eslabón de la suya es poderoso interesante. Me preocupa el comportamiento potencialmente indefinido del método toString() definido implícitamente. Los arquitectos de la empresa han realizado esfuerzos impresionantes para garantizar que la base de datos en sí esté bien oculta (como deberían). Ni siquiera sé qué DBMS se está ejecutando o si se cambiará en el futuro. – phobos51594
En realidad, pensándolo bien, no parece que PreparedStatement tenga incluso un constructor de acceso público. Como no tengo un objeto de conexión JDBC, no estoy seguro de cómo podría obtener un objeto PreparedStatment para empezar. Hm. – phobos51594
Sí, puedo ver cómo eso sería un enigma. No he usado Log4JDBC, pero parece que podría generar el SQL para usted según la declaración preparada. – ametren