Cómo construir consulta en Java para evitar la inyección SQL mediante declaración preparada

Sebin Mathew:

Necesito construir una consulta de tal manera que se evite la posibilidad de un ataque de inyección SQL.

Conozco dos maneras de construir una consulta.

String query = new StringBuilder("select * from tbl_names where name = '").append(name).append(';).toString();

String query = "select * from tbl_names where name = ? ";

En el primer caso, todo lo que hago es una Connection.prepareStatement (consulta)

En el segundo caso que hago algo así como:

PreparedStatement ps = connection.prepareStatement(query)
ps.setString(1,name);

Quiero saber cuál es el estándar de la industria? Cómo se utiliza la forma de cadena de datos anexados para construir la consulta y luego preparar la declaración o preparar la declaración ya y pasar parámetros más adelante?

Marcos Rotteveel:

Su primer fragmento de código es inseguro y vulnerable a la inyección de SQL. Usted no debe usar esa forma.

Para hacer su primer fragmento de seguridad, lo que se necesita para escapar manualmente el valor de la inyección de SQL Prevent. Esto es difícil de hacer correctamente y elegir el camino equivocado de los valores de manipulación podría reducir potencialmente el rendimiento en función de la base de datos subyacente (por ejemplo, algunos sistemas de bases de datos no van a usar un índice si se suministra un literal de cadena para una columna entera).

El segundo fragmento es la forma estándar. Lo protege contra la inyección de SQL. Utilice este formulario.

Usando una declaración preparada con marcadores de posición de parámetros es mucho más simple, y también permite volver a utilizar la sentencia compilada con diferentes conjuntos de valores. Además, dependiendo de la base de datos, esto puede tener ventajas adicionales de rendimiento para la reutilización de los planes de consulta a través de conexiones.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=335660&siteId=1
Recomendado
Clasificación