Consideremos un caso hipotético en el que tengo que recuperar algunos detalles de la base de datos basado en el ID de usuario y el código de ejemplo es la siguiente¿Las declaraciones preparadas evitarán los ataques de inyección sql?
private String getpassword(String username) {
PreparedStatement statement = null;
ResultSet resultSet = null;
Connection conn = null;
final String selectQuery = "SELECT password FROM " + "users WHERE username=?";
try {
conn = dataSource.getConnection();
statement = conn.prepareStatement(selectQuery);
statement.setString(1, username);
resultSet = statement.executeQuery();
if (resultSet.next()) {
}
} catch (SQLException e) {
// log it
}
//return
}
Este nombre de usuario es en realidad viene del lado del cliente y el usuario puede manipular los datos (si él quiere) Entonces, preparedStatements evitará aceptar presupuestos y enviará solo la forma filtrada de SQL a la base de datos.
Por ejemplo: puedo proporcionar username = 'o 1 = 1 y será una declaración SQL válida. Pero si el controlador escapa de las cotizaciones de las entradas del usuario, entonces evitarían las inyecciones de sql.
¿Cuál es la comprensión general de la misma?
lo siento por mi respuesta equivocada anterior (eliminado). Parece que funcionan. mira esta publicación: http://stackoverflow.com/questions/1812891/java-escape-string-to-prevent-sql-injection – Heisenbug
La prevención de la inyección de SQL mediante el escapado adecuado es uno de los motivos por los que se crearon las declaraciones preparadas. – Jacob
posible duplicado de [¿Puedo evitar todos los ataques de inyección SQL mediante el uso de parámetros?] (Http://stackoverflow.com/questions/3736831/can-i-avoid-all-sql-injection-attacks-by-using-parameters) – Thilo