Evitar sql injection em JSP?

24 respostas
F

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

no agurdo e obrigado!
fernando Becker

24 Respostas

T

"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.

C

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

T

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

F

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?

F

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:

T

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.

F

é 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?

T

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

F

tentei mas ta dando um erro de sintaxe no PreparedStatemend.

F

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

T

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 é?

F

ddshdusahD malz a garfe =P

F
/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

T

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.

F

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
M
sql.toString()
?

Já tentou ler a mensagem e procurar no Javadoc?

<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#executeQuery(java.lang.String)" data-bbcode="true">http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#executeQuery(java.lang.String)</a>

<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html" data-bbcode="true">http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html</a>

<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html#toString()" data-bbcode="true">http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html#toString()</a>

e estás passando StringBuffer.

Até!

F

nem tinha percebido!
valeu vou tentar aqui!

R

nossa… que povo mal-humorado :?

J

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?

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.

S

Vcs às vezes parecem viver numa BOLHA de Patterns!!!
Ou então numa religião do GOF…

O cara apenas quer manter um código… o chefe não deu recurso pra ele, não deu tempo, não deu treinamento, não deu permissão para alterar (risco x retorno) e vcs sugerindo que o mundo seja melhor e mais justo!!!

tenha paciência… chatinho demais vcs!!!

RESPOSTA: vc tem que fazer igual o Fábio disse. Dê uma pesquisada em como usar PreparedStatement… tem exemplos demais na NET. Isso pode demandar tempo e vc tem que reportar esse tempo ao seu cliente e/ou superior e dizer que está aplicando em segurança.

Existem outras soluções menos elegantes como testar a ocorrência de caracteres (aspas, ponto, virgula, as palavras exatas AND ou OR) na String de where…

D

Fio, vai pelo que o Fabio falou, PreparedStatement vai fazer isso ai parecer pega-pega nos tempos de criança rsrsrsr

B

Acho que 2 anos foi tempo suficiente pra ele descobrir isso sozinho.

D

hauhauahua nossa cara pior que é verdade.

Vacilo total kkkkk mais valeu

abraço

S

mas tem SEMPRE alguem precisando de uns helps nisso…

Criado 25 de junho de 2007
Ultima resposta 17 de ago. de 2009
Respostas 24
Participantes 10