java - tipos - ¿ReadyStatement evita la inyección de SQL?
sql injection prevencion (4)
Bueno, simplemente usar PreparedStatement
no lo pone a salvo. Debe usar parámetros en su consulta SQL
que es posible con PreparedStatement
. Mire here para más información.
Esta pregunta ya tiene una respuesta aquí:
He leído y tratado de inyectar consultas sql vulnerables a mi aplicación. No es lo suficientemente seguro. Simplemente estoy usando la Conexión de extracto para validaciones de base de datos y otras operaciones de inserción.
¿Son seguros los estados preparados? y además ¿habrá algún problema con esta declaración también?
Como se explica en este artículo , PreparedStatement
por sí solo no lo ayuda si todavía está concatenando cadenas.
Por ejemplo, un atacante pícaro aún puede hacer lo siguiente:
- llamar a una función de reposo para que todas las conexiones a su base de datos estén ocupadas, por lo tanto, haciendo que su aplicación no esté disponible
- extraer datos sensibles de la base de datos
- eludiendo la autenticación del usuario
Y no es solo SQL el que puede verse afectado. Incluso JPQL puede verse comprometido si no está utilizando parámetros de enlace.
En pocas palabras, nunca debe usar la concatenación de cadenas al construir sentencias de SQL. Use una API dedicada para ese propósito:
La declaración preparada, si se usa correctamente, protege contra la inyección de SQL. Pero publique un ejemplo de código para su pregunta, para que podamos ver si lo está utilizando correctamente.
Usar la concatenación de cadenas para construir su consulta a partir de una entrada arbitraria no hará que PreparedStatement
seguro. Echale un vistazo a éste ejemplo:
preparedStatement = "SELECT * FROM users WHERE name = ''" + userName + "'';";
Si alguien pone
'' or ''1''=''1
como userName
, su PreparedStatement
será vulnerable a la inyección de SQL, ya que esa consulta se ejecutará en la base de datos como
SELECT * FROM users WHERE name = '''' OR ''1''=''1'';
Entonces, si usas
preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);
Estarás a salvo.
Parte de este código tomado de este artículo de Wikipedia .