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…
- Não deves concatenar tantas Strings com +. Usa StringBuilder.
- Não deves concatenar strings SQL !
- Para o sqlUpdate deves passar os valores dos campos.
- O sqlUpdate deve usar uma String unica e não-concatenada de valores
parameterizados.
- 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 ();
}