¿Existe un Java equivalente a mysql_real_escape_string() de PHP?Java equivalente para mysql_real_escape_string() de PHP
Esto es para evitar intentos de inyección de SQL antes de pasarlos a Statement.execute().
Sé que puedo usar PreparedStatement en su lugar, pero supongamos que estas son declaraciones de un solo disparo por lo que su preparación dará como resultado lower performance. Ya he cambiado el código para usar PreparedStatement, pero dada la forma en que se ha estructurado el código existente, una función de escape (escape) haría que el código sea mucho más simple de revisar y mantener; Prefiero un código fácil de mantener a menos que exista una razón convincente para la complejidad adicional. Además, la base de datos maneja de manera diferente los estados preparados, por lo que esto podría exponernos a errores en la base de datos con los que no nos hemos encontrado antes, y que requieren más pruebas antes de lanzarlos a la producción.
Apache StringEscapeUtils escapeSQL() solo escapa de comillas simples.
Postscript: Hay muchas sutilezas en el entorno que heredé que evité deliberadamente en mi pregunta.
dos puntos a considerar:
1) declaraciones preparadas no son una panacea y no ofrecen una protección del 100% contra la inyección de SQL. Algunos controladores de base de datos instancian consultas parametrizadas utilizando una concatenación de cadenas inseguras, en lugar de precompilar la consulta a una forma binaria. Además, si su SQL depende de procedimientos almacenados, debe asegurarse de que los procedimientos almacenados no generen consultas de forma insegura.
2) La implementación de la declaración más preparada vincula la declaración a la conexión de la base de datos en la que se creó la instancia de la declaración. Si está utilizando la agrupación de conexiones de bases de datos, debe tener cuidado al
utilizar la referencia de declaración preparada solo con la conexión en la que se preparó. Algunos mecanismos de puesta en común implementan esto de forma transparente. De lo contrario, podría agrupar también las declaraciones preparadas o (más simple pero más sobrecarga) crear una nueva declaración preparada para cada consulta.
Prefiere fácil de mantener el código, y sin embargo, prefiere utilizar la cadena manual de escape en lugar de PrearedStatement? – skaffman
Dada la forma en que el código existente (que no escribí) es, sí, sería más fácil de mantener. –
el menor rendimiento puede ser más atractivo que el riesgo de seguridad. la pena de seguridad puede ser demasiado alta. Prepare sus declaraciones en el código de inicialización de la aplicación y la penalización puede no ser notoria (depende de la aplicación, por supuesto). – Cheekysoft