2011-08-19 10 views
5

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?

+0

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

+0

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

+0

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

Respuesta

0

El nombre de usuario y la consulta se enviarán a la base de datos como dos cosas separadas, y el motor de base de datos se encargará de volver a unir los dos. La consulta ya está compilada por el motor en el momento en que se lee el parámetro, por lo que los dos nunca se consideran parte de la misma declaración.

3

El uso de parámetros y una declaración preparada previene los ataques de inyección SQL, es decir, al pasar "'o 1 = 1" no se obtendrán datos no intencionados. Sin embargo, si en cualquier etapa muestra los datos de vuelta al usuario, debe asegurarse de que el HTML que se produce no se vea afectado por la entrada del usuario que proviene de la base de datos

Por ejemplo, si su página web muestra :

Hello, ${username} 

si el nombre de usuario es

<script>alert('I could have been more malicious')</script> 

puede conducir a ataques XSS o CSRF.

N.B.

Hello, ${fn:escapeXml(username)} 

sería más seguro (código JSP).

Una buena referencia es:

Cuestiones relacionadas