Tengo que agregar una instrucción mi programa java para actualizar una tabla de base de datos:

String insert =
    "INSERT INTO customer(name,address,email) VALUES('" + name + "','" + addre + "','" + email + "');";

Me enteré de que este puede ser explotado a través de una inyección SQL como:

DROP TABLE customer; 

Mi programa tiene una GUI de Java y todo nombre, dirección de correo electrónico y valores se recuperan de Jtextfields. Quiero saber el código siguiente (DROP TABLE customer;) podría ser añadido a mi insertar instrucción por parte de un hacker y cómo puedo evitar esto.

OriginalEl autor Grant | 2012-03-01

8 Comentarios

  1. 20

    Necesita utilizar PreparedStatement.
    por ejemplo,

    String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
    PreparedStatement ps = connection.prepareStatement(insert);
    ps.setString(1, name);
    ps.setString(2, addre);
    ps.setString(3, email);
    
    ResultSet rs = ps.executeQuery();

    Esto evitará los ataques de inyección.

    La forma en que el hacker pone ahí es que si la Cadena está insertando ha llegado a partir de la entrada en algún lugar – por ejemplo, un campo de entrada en una página web, o un campo de entrada en un formulario en una aplicación o similares.

    Este hecho va a prevenir ataques de inyección de SQL a un cierto punto, porque separa el código a partir de los datos. He aquí un breve tutorial que cubre el uso de Declaraciones Preparadas con Java JDBC.

    OriginalEl autor Matt Fellows

  2. 12

    Quiero saber cómo este tipo de pieza de código(«DROP TABLE cliente;») puede
    se añadirá a mi insertar instrucción por parte de un hacker

    Por ejemplo:

    name = "'); DROP TABLE customer; --"

    produciría este valor en insertar:

    INSERT INTO customer(name,address,email)     VALUES(''); DROP TABLE customer; --"','"+addre+"','"+email+"');

    Especialmente me quieren saber cómo se puede prevenir este

    El uso de declaraciones preparadas y SQL argumentos (por ejemplo, «robado» de Matt Becarios):

    String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
    PreparedStament ps = connection.prepareStatment(insert);

    También analizar los valores de dichas variables y asegurarse de que no contienen no permite caracteres (tales como el «;» en el nombre).

    Estoy usando una interfaz gráfica de usuario. La persona sólo puede entrar en valores a través de campos de texto. ¿Cómo pueden agregar dicha pieza de código a mi statenment. como esta INSERT INTO clientes(nombre,dirección,email) VALUES(«); DROP TABLE cliente; –«‘,'»+addre+»‘,'»+email+»‘);
    ¿Por qué no entrar en ‘); DROP TABLE cliente; — en un campo de texto? Y de todos modos, un usuario malintencionado puede hackear los campos de texto limitaciones (por ejemplo, la modificación de la RAM directamente, la inyección de forjado de paquetes de red, etc…).
    OK. Tengo el punto.Thnk!
    Gracias por el crédito en la «Robar» 😉
    No quería volver a escribir yo mismo 😀

    OriginalEl autor m0skit0

  3. 7

    Puede comprobar ESTE artículo para información sobre eso! 🙂

    Recomiendo Consultas Parametrizadas:

    String selectStatement = "SELECT * FROM User WHERE userId = ? ";
    PreparedStatement prepStmt = con.prepareStatement(selectStatement);
    prepStmt.setString(1, userId);
    ResultSet rs = prepStmt.executeQuery();

    OriginalEl autor aF.

  4. 5

    Un atacante sólo tiene que introducir algo como '[email protected]"); DROP TABLE customer; en el campo de email y listo.

    Esto se puede evitar usando el buen escape para JDBC Declaraciones.

    OriginalEl autor

  5. 2

    Es por eso que usted debe utilizar los signos de interrogación en su cadena de declaraciones:

     PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                         SET SALARY = ? WHERE ID = ?");
       pstmt.setBigDecimal(1, 153833.00)
       pstmt.setInt(2, 110592)

    citado de aquí

    OriginalEl autor dimitrisli

  6. 1

    Ir para PreparedStatement
    Ventajas de un PreparedStatement:

    De precompilación y base de datos de caché en el lado de la instrucción SQL conduce a la total ejecución más rápida y la capacidad de reutilización de la misma instrucción SQL en lotes.

    Automática de la prevención de los ataques de inyección SQL por builtin escapar de comillas y otros caracteres especiales. Tenga en cuenta que esto requiere que usted use cualquiera de los PreparedStatement setXxx() los métodos para establecer el valor

    OriginalEl autor Mukesh Kumar

  7. 1

    Como se explica en este post, el PreparedStatement solo no ayuda, si usted todavía está concatenación de Cadenas.

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

    • llamar a una función del sueño para que todos sus conexiones de base de datos va a ser ocupado, por lo tanto, su aplicación no está disponible
    • la extracción de los datos sensibles de la DB
    • eludir la autenticación de usuario

    Y no sólo en SQL, pero JPQL y HQL puede verse comprometida si no se están utilizando enlazar parámetros:

    PreparedStatement ps = connection.prepareStatement(
        INSERT INTO customer(name,address,email) VALUES(?, ?, ?)
    );
    int index = 0;
    ps.setString(++index, name);
    ps.setString(++index, address);
    ps.setString(++index, email);
    
    ResultSet rs = ps.executeQuery();

    Parte inferior de la línea, usted nunca debe utilizar la concatenación de cadenas cuando la construcción de sentencias SQL. El uso de un dedicado API para ese propósito:

    OriginalEl autor Vlad Mihalcea

  8. 0

    Aunque todas las otras respuestas decirte que ¿cómo se puede solucionar inyecciones SQL en Java, la respuesta de Mukesh Kumar le dice como que es en realidad la prevención de este tipo de ataques. Entender que su realidad servidor de DB que es la prevención de los ataques de inyección SQL proporcionado como un programador de seguir su recomendación de uso de parametrizadas consultas.

    Consulte Aquí – la Prevención de Vulnerabilidades de Inyección SQL

    No sería posible para el programador de Java para desinfectar cada & cada Cadena de entrada así DB vendedores nos han dado opciones de Declaraciones Preparadas y nos dicen a preparar & ejecutar consultas mediante el uso de la & resto de las cosas van a ser atendidos por la base de datos del proveedor.

    Cosas tan drástico como DROP TABLE customer; podría no suceder pero la premisa básica de la inyección de SQL es que nadie debería ser capaz de romper su consulta proporcionando entrada no válida ( ya sea intencional o no intencional ).

    OWASP – Inyección de SQL Prevención de la Hoja de Trucos

    OriginalEl autor Sabir Khan

Dejar respuesta

Please enter your comment!
Please enter your name here