Evitar sql injection em JSP?

alguem poderia me ajudar a evitar sql injection em jsp??

no agurdo e obrigado!
fernando Becker

"No aguardo " é coisa de mulher grávida, e depois do parto ela fica “em resguardo”. Que expressão horrível…

De qualquer maneira, para evitar SQL Injection, a maneira mais simples é NUNCA montar expressões SQL “no braço” dentro de seu código; sempre usar Prepared Statements.

E, aproveitando… nao se poe SQL no JSP, entao nao entendi seu problema pra comecar :wink:

O que o CV disse e repisa é recomendação oficial da Sun (não pôr código SQL ou Java em JSPs:)

http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/web-tier/web-tier3.html#1097966

nao gostei do comentario no aguardo!! hehe
mas no caso de eu ter um sql em meu codigo jsp… sei que nao é o recomendavel mas tenho um projeto enorme no qual estou comecando a trabalhar… tem com comparar o campo e apenas substituir as aspas simples?

bom, se nao da pra refatorar a cagada de por sql no JSP, pelo menos a concatenação dá ne?

se vc usar Statement, vai te q ficar fazendo algo horrivel como:

… “AND NOME LIKE’” + pesquisa.getNome() + “’ MAIS SQL CONCATENADO”…

em vez disso, vc monta teu sql assim:

StringBuffer sql = new StringBuffer();

sql.append( “WHERE CAMPO1 LIKE ?”);
sql.append( “AND CAMPO2 LIKE ?”);
sql.append( “AND CAMPO3 = ?”);
sql.append( “AND CAMPO4 = ?”);

PreparedStatemend pstmt = SuaConexao.prepareStatement( sql.toString() );

pstmt.setString(1, “dsdadads”);
pstmt.setSTring(2, “dosaidasodi”);
pstmt.setLong(3, 1000);
pstmt.setTimestamp(4, pesquisa.getData() );

os ‘aspas’ serao colocados pelo JDBC qdo for string. e no caso de Datas, ele faz o que deve fazer tambem…

OU…

para 1 dia, ranca tudo e usa Hibernate :wink:

Há um monte de casos em que um atacante pode introduzir código malicioso. O exemplo clássico é o que você faz com aspas simples, como você mencionou. Nesse caso bastaria duplicar as aspas.

Mas isso acho que não é suficiente, porque outros ataques são possíveis com:

  • Entradas de tamanho ilimitado - alguém pode pôr uma string de 10.000 caracteres, submetê-la e fritar o driver do seu banco;
  • Caracteres especiais de escape - por exemplo, no HSQLDB você pode incluir “” para escapar caracteres unicode em Strings. Se você não escapar corretamente os “\” também, você pode ter uma variação do ataque com as aspas simples.

Eu recomendaria varrer o código e substituir (gradativamente, é claro!) com PreparedStatements. Isso tem o efeito colateral de corrigir outras vulnerabilidades que podem estar “escondidas” no seu código.

é so o na parte de login que preciso fzer isso! por isso achu que compar e substituir ja esta bom ate eu refazer o projeto dentro dos conformes!!!
alguem me ajuda a fazer isso?

Siga o que o FabioCSI lhe sugeriu. Mais bem explicado que isso…

tentei mas ta dando um erro de sintaxe no PreparedStatemend.

da segunda linha em diante nos appends do StringBuffer, coloque um espaço no inicio da string.

O Fábio cometeu um erro de ortografia (ele deve ter postado - ele escreveu PreparedStatemend em vez de PreparedStatement.

Mas não é nada que você, que é esperto, não possa corrigir sozinho, não é?

ddshdusahD malz a garfe =P

/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:39:
cannot resolve symbol
symbol  : method append (java.lang.String)
location: class java.lang.String
			sql.append( "where USU_LOGIN like "+login+" ");
                           ^
/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:40:
cannot resolve symbol
symbol  : method append (java.lang.String)
location: class java.lang.String
			sql.append( "and USU_SENHA like "+senha+" ");
                           ^
/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:41:
cannot resolve symbol
symbol  : method append (java.lang.String)
location: class java.lang.String
			sql.append( "and USU_ATIVO like S ");
                           ^
/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:46:
cannot resolve symbol
symbol  : method setSTring (int,java.lang.String)
location: interface java.sql.PreparedStatement
			pstmt.setSTring(2, "teste");
                             ^
4 errors

sim mas esses aqui nao so tao espewrto assim… hehe

O Fábio escreveu isto aqui:

StringBuffer sql = new StringBuffer();

Ele não escreveu “String sql = “””

É por isso que você está tendo problema com os “appends” - você não está lendo o que ele escreveu.

tudo bem ate ai foi brrice minha mas e esses aqui??

/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:61:
executeQuery(java.lang.String) in java.sql.Statement cannot be applied
to (java.lang.StringBuffer)
   	      ResultSet rs = stmt.executeQuery(sql); 		  
                                 ^
/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:96:
incompatible types
found   : java.lang.String
required: java.lang.StringBuffer
                                                 "DEP_CODIGO = "+this.dep_codigo+")";
                                                                                ^
/usr/java/resin-3.0.14/webapps/intrateste/WEB-INF/classes/loginintra/b_loginintra.java:97:
executeQuery(java.lang.String) in java.sql.Statement cannot be applied
to (java.lang.StringBuffer)
               rs = stmt.executeQuery(sql);
                        ^
3 errors
sql.toString()

?
Já tentou ler a mensagem e procurar no Javadoc?
http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#executeQuery(java.lang.String)
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html#toString()

e estás passando StringBuffer.

Até!

nem tinha percebido!
valeu vou tentar aqui!

nossa… que povo mal-humorado :?

[quote=febeckers]é so o na parte de login que preciso fzer isso! por isso achu que compar e substituir ja esta bom ate eu refazer o projeto dentro dos conformes!!!
alguem me ajuda a fazer isso?
[/quote]

Cara, se é só na parte do login como você falou, porque já não faz da forma correta? Nunca deve existir sql em uma JSP, e nunca é NUNCA mesmo. Ao invés de fazer remendo, já corrige o que está errado. Não vejo porque fazer um POG pra corrigir outro.