Querys SQLinjection

7 respostas
F

Bom dia,

Queria saber quais são as opções que tenho para criar querys SQL no Java.

Tenho a seguinte situação

String query = "select * from produto where ativo = 1";

if(nomeP != null){
   query += " and nome like '%"+nomeP+"%'";
}
if(fabricante != null){
   query += " and fabricante like '%"+fabricante +"%'";
}

Mas com isso teria SQLInjection. quais são as melhores praticas para isso.

7 Respostas

Rodrigo_Sasaki

Pesquise por PreparedStatement

F

Eu cheguei a dar uma olhada no PreparedStatement, mas não consigo uma solução para quando tenho parametros variados na query.

A unica solução que imaginei para isso seria

int intNome = 0;
		int intFabricante = 0;
		String fabricante= "";
		String query = "select * from produto where ativo = 1";  
		  
		if(nomeP != null){
		   query += " and nome like '%?%'";  
		   intNome = ++intParams;
		}  
		if(fabricante != null){  
		   query += " and fabricante like '%?%'";
		   intFabricante = ++intParams;
		}  
		
		PreparedStatement ps = conn.prepareStatement(query);
		if (nomeP != null) {
			ps.setString(intNome, nomeP);
		}
		if (fabricante != null) {
			ps.setString(intFabricante, fabricante);
		}
Rodrigo_Sasaki

É, montar uma query assim é sempre um trabalho sujo. uns ifs que você não queria ter que colocar na sua query.

A vantagem no final ao usar o PreparedStatement é que você não tem que se preocupar com SQL Injection

F

Obrigado, melhor colocar ifs no codigo do que no sql…
obrigado.

Rodrigo_Sasaki

Concordo com você :slight_smile:

gomesrod

Como o Rodrigo disse, fica sujão, mas usando JDBC não dá pra fugir de alguma coisa parecida com isso.

Só um pequeno erro: quando se usa PreparedStatement não se coloca as aspas:

where campo_string = '?'   // errado
where campo_string = ?   // certo

As aspas são incluídas automaticamente ao redor do valor, assim como é feito o tratamento das aspas que por acaso estiverem dentro do parâmetro (evitando SQLInjection)

E aí os curingas do like acabam não funcionando também dessa forma… para fazer like seu código vai ter que ficar ainda mais feio :slight_smile:

query = ....... where campo_string like ? 
query.setString(1, "%" + valor + "%");
F

é quando implementei percebi esses detalhes. Mas obrigado mesmo assim Gomesrod

Criado 5 de abril de 2013
Ultima resposta 5 de abr. de 2013
Respostas 7
Participantes 3