Evitar SQL Injection apenas ignorando aspas simples?

Boa tarde pessoal. Perdão se esse tópico já existir. Estou com uma dúvida sobre o tratamento de SQL Injection. Tenho uma aplicação com as queries em strings, como: “SELECT * FROM Pessoas WHERE CodPessoa=’”+ codigo +"’";
Os meios de SQL Injection que eu vi consistem em você colocar uma aspa simples e em seguida comentar o resto da query com – ou colocar um comando SQL (Tipo OR 1=1). Mas minha dúvida é: Se eu fizer algo do tipo codigo.replace("’", “”); (Eliminando qualquer aspas simples da entrada do usuário) já não é suficiente para evitar o problema?

@Alexis_Cesar Olá, pq vc não usa o PreparedStatement ele já evita esse tipo de sql injection? Se vc estiver usando o Hibernate a interface Query já tem esse recurso tambem

1 curtida

Dei uma olhada rápida, acho que é melhor usar esses PreparedStatements mesmo, só não sei se entendi direito como funciona. Consegue mandar um exemplo? Se não for pedir demais, é claro.

Aqui um exemplo com select

    try (Connection conn = DriverManager.getConnection(
            "jdbc:postgresql://127.0.0.1:5432/test", "postgres", "password"){
 //Exemplo usando o select 
    PreparedStatement stmt = connection.prepareStatement("SELECT * FROM usuarios WHERE id_usuario=? AND senha=?");//onde as interrogações indicam quais parametros vai ser setado posteriormente

      //aqui vc set os valores de acordo com tipo da coluna equivalente, especificando a ordem do indice,
     // por exemplo a coluna abaixo vc esta setando o primeiro parametro que vc colocou como interrogação + o valor idUsuario que é inteiro, nesse caso tem que o tipo dessa coluna no banco e procurar na net o equivalente em java, exemplo, o nvarchar o equivalente seria String, entendeu?
      stmt.setInt(1, idUsuario);

      stmt.setString(2, senha);

      ResultSet rs = stmt.executeQuery();

   } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
    }

Aqui um exemplo com insert

          String SQL_INSERT = "INSERT INTO EMPREGADO (NOME, SALARIO, DATA_CRIACAO) VALUES (?,?,?)";
          try (Connection conn = DriverManager.getConnection(
                "jdbc:postgresql://127.0.0.1:5432/test", "postgres", "password"){
             PreparedStatement preparedStatement = conn.prepareStatement(SQL_INSERT)) {

            preparedStatement.setString(1, "Alexis");
            preparedStatement.setBigDecimal(2, new BigDecimal(799.88));
            preparedStatement.setTimestamp(3, Timestamp.valueOf(LocalDateTime.now()));

           //executo essa chamada para efetuar de fator a inserção
            int row = preparedStatement.executeUpdate();

            // resultado numero de linhas afetadas, nesse caso nem sempre é 1 pode ser maior
            System.out.println(row); //1

        } catch (SQLException e) {
            System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
2 curtidas

Entendi!! Muito obrigado pela ajuda e pelos exemplos!

1 curtida