2010-12-02 13 views
31

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.¿ReadyStatement evita la inyección de SQL?

¿Es seguro el estado de las declaraciones preparadas? y además ¿habrá algún problema con esta declaración también?

+1

declaraciones preparadas son el camino a seguir. AFAIK una declaración preparada solo se analizaría una vez, por lo que no hay posibilidad de inyección SQL en una fecha posterior. Por supuesto, igual necesitará sanitizar la entrada para protegerse contra ataques XSS, etc. – CurtainDog

Respuesta

47

mediante concatenación de cadenas para la construcción de la consulta de entrada arbitraria no hará PreparedStatement seguro. Echar un vistazo a este 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 la consulta se ejecuta en la base de datos como

SELECT * FROM users WHERE name = '' OR '1'='1'; 

Por lo tanto, si usa

preparedStatement = "SELECT * FROM users WHERE name = ?"; 
preparedStatement.setString(1, userName); 

estará seguro.

Parte de este código tomado de this Wikipedia article.

+3

¿El setString hace alguna diferencia? ¿Qué es lo que realmente hace? Incluso eso va a sustituir la cadena en el lugar. ¿Qué diferente hace? –

+10

@Mohamed: hace la diferencia. La consulta '" SELECT * FROM usuarios WHERE name =? "' Se enviará a la base de datos donde se compila y luego 'userName' from' setString' se sustituirá. Si la base de datos ve un valor ilegal, arrojará un error. Entonces, ''o' 1 '=' 1' se tratarán como una cadena completa, y no como una declaración que involucre a los operadores' o' y '='. La base de datos lo verá como una cadena con el valor '" 'o' 1 '=' 1 "'. – darioo

2

La declaración preparada, si se usa correctamente, protege contra la inyección SQL. Pero publique un ejemplo de código para su pregunta, para que podamos ver si lo está utilizando correctamente.

1

bien el simple uso de PreparedStatement no te hace seguro. Debe usar parámetros en su consulta SQL que es posible con PreparedStatement. Mire here para más información.

1

Como se explica en this article, el PreparedStatement por sí solo no le ayuda si todavía está concatenando cadenas.

Por ejemplo, un atacante pícaro todavía puede hacer lo siguiente:

  • llamada de una función de apagado automático para que todas las conexiones de base estarán ocupados, por lo tanto, hacer que su aplicación no esté disponible
  • extraer información confidencial de la DB
  • bypassing the user authentication

Y no se trata sólo de SQL que puede b afectados. 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 crear sentencias de SQL. Utilizar una API específica para ese propósito: