Classe anti sql inject

Fala galera,

Fiz um site a algum tempo atrás onde o mesmo se conectava ao sql server, era um site do jogo muonline, e como não conhecia muito a respeito de sql inject, não coloquei nenhuma proteção. Certo dia o meu cliente me ligou dizendo que o banco de dados havia sido apagado e eu não tive dúvidas, alguém fez sql inject.
Tomei as medidas necessárias, com uma classe em php que não permitia códigos maliciosos enviados por post e get chegassem a ser executados no banco.

O que eu gostaria de saber é se alguém aqui já criou algo do tipo, alguma classe que check as variáveis passada para a minha query, pois estou desenvolvendo um site em jsp que se conecta ao sql server e não quero cometer o mesmo erro.

Vlw povo, desde já agradeço a atenção.

Fernando Lopes

uma arquitetura bem definida e um framework de persistencia bem utilizado (hibernate, por exemplo) impedem o uso de sql inject na sua aplicação…

Simplesmente evite concatenar String’s e enviar ao banco de dados, use PreparedStatement que você não terá problemas com isso.

Bom, vamos ver se eu entendi.

Minha classe de persistencia tem o seguinte metodo:

    public int sqlUpdate(String sql){
        int res = 0;
        try {
            PreparedStatement pStmt = con.prepareStatement (sql);
            res = pStmt.executeUpdate ();
            /*
                Statement stmt = con.createStatement ();
                res = stmt.executeUpdate (sql);
             */
        } catch (SQLException ex) {
            ex.printStackTrace();
            return res;
        }
        return res;
    }

E na classe Cliente, eu faço o seguinte update:

String sql = "UPDATE CLIENTE SET CLIECEP = '" + this.cep + "'" +
                     " ,CLIETIPOLOGRADOURO = '" + this.tipoLogradouro + "'" +
                     " ,CLIELOGRADOURO = '" + this.logradouro + "'" +
                     " ,CLIENUMERO = '" + this.numero + "'" +
                     " ,CLIEBAIRRO = '" + this.bairro + "'" +
                     " ,CLIEUF = '" + this.uf + "'" +
                     " ,CLIECIDADE = '" + this.cidade + "'" +
                     " ,CLIETELEFONE1 = '" + this.telefone1 + "'" +
                     " ,CLIEOBSERVACAO = '" + this.observacao + "'" +
                     " WHERE CLIECLIENTE = '" + id + "'";

int res = conn.sqlUpdate (sql);

A minha grande dúvida é, se por ventura um cliente deixa vazar a senha e um indivíduo acessa a administração, se ele setar alguma variável com a string “drop table cliente” e eu executar o update, terei problemas com isso ou a string simplesmente ficara gravada no banco como “drop table cliente”???

Esse é meu medo, do cara enviar pelo formulário códigos desse tipo.

vlw pela atenção.

aparentemente, da forma como estão suas coisas, a instrução sql vai ficar gravada no seu banco mesmo…pelo menos vc vai saber se alguem tentou te zuar, hehehehe

flw

[quote=“pedrobusko”]aparentemente, da forma como estão suas coisas, a instrução sql vai ficar gravada no seu banco mesmo…pelo menos vc vai saber se alguem tentou te zuar, hehehehe

flw[/quote]

Esse “aparentemente” chega a me dar frio na barriga^^

vlw

hauhauahuahuahau

eu digo aparentemente pq não conheço seu sistema, não conheço a arquitetura dele, vi 2 pequenos trechos de código…

faça uma analise aih, e veja se vc acha possível o sql inject, pesquise sobre as técnicas utilizadas…

outra coisa, vc não esta utilizando os recursos do PreparedStatement, da uma procurar em alguns exemplos…pesquise tb sobre o padrão DAO, vc vai ver q as suas queries vão ficar na sua classe de persistencia, como vc chamou…e o seu Bean cliente vão servir para representar um Objeto Cliente, com seus parametros e getters e setters, procure sobre POJO e TO, são coisas diferentes mas com conceitos parecidos…

espero ter ajudado…

  1. Não deves concatenar tantas Strings com +. Usa StringBuilder.
  2. Não deves concatenar strings SQL !
  3. Para o sqlUpdate deves passar os valores dos campos.
  4. O sqlUpdate deve usar uma String unica e não-concatenada de valores
    parameterizados.
  5. o sqlUpdate deve substituir os valores nos lugares certos e executar a query.

Exemplo


// define uma constance com a instrução parameterizada
   final static String sql = "UPDATE CLIENTE SET CLIECEP = ? 
                      ,CLIETIPOLOGRADOURO = ? 
                      ,CLIELOGRADOURO =  ?  
                      ,CLIENUMERO = ? 
                      ,CLIEBAIRRO = ? 
                      ,CLIEUF = ? 
                      ,CLIECIDADE = ? 
                      ,CLIETELEFONE1 = ? 
                      ,CLIEOBSERVACAO = ? 
                      WHERE CLIECLIENTE = ? "; // tudo numa linha só e não precisa de " nos textos

    public int sqlUpdate(Dados dados) throws SQLException {
       
            PreparedStatement ps = con.prepareStatement (sql);
             ps.setString(1, dados.getCEP());
             ps.setString(2, dados.getTipoLogradoudo());
            // etc...

            return ps.executeUpdate ();

    }