Galera to fazendo um site com vraptor 3 e queria saber se é possivel criar um filter que barre qualquer caracter inapropriado que possa gerar sql injection na minha aplicação, pq seira mais facil eu criar um filtro que barre isso de qualquer request do meu site do q sair colocando essa berreira em cada parte do codigo que for necessario.
O mais fácil é criar sua query corretamente.
Não fazer select … where nome = " + nome + "
É isso que abre espaço para esse ataque.
Mas eu to trabalhando com hibernate, e nele só da pra usar aquele recurso parecido com o usado no preparedStatement onde vc passa os valores para query através de “?,?,?”, q eu saiba o equivalente a isso no hibernate são as named queries, porem minha query é dinamica e montada através de varios ifs, nao sei aplicar isso numa namedquery, vc teria alguma sugestão pra esse caso?
[quote=renatomattos2912]Mas eu to trabalhando com hibernate, e nele só da pra usar aquele recurso parecido com o usado no preparedStatement onde vc passa os valores para query através de “?,?,?”, q eu saiba o equivalente a isso no hibernate são as named queries, porem minha query é dinamica e montada através de varios ifs, nao sei aplicar isso numa namedquery, vc teria alguma sugestão pra esse caso?[/quote]Não tem problema. Crie sua query dinamicamente e ao invés de fazer where nome = " + nome + " faça where nome = :nome e depois passe o parâmetro.
entendi, muito obrigado pela ajuda
vou deixar aqui uma materia sobre para quem precisar http://www.mkyong.com/hibernate/hibernate-parameter-binding-examples/
Se você faz assim o próprio hibernate faz o trabalho!
Qualquer duvida é fácil de testar pois é só ‘forçar’ uma injeção de ‘código’ na sua consulta’.
Bom dia galera, eu tinha dado como resolvido o problema porem me surgiu uma duvida.
Beleza aprendi com vcs que é possivel usar o setparameter nas querys mesmo escrevendo elas em query nativo e etc, porem minha duvida é quanto a querys dinamicas, ou seja a minha query sera montada de acordo com os filtros que o usuario escolher no site, ou seja, na hora de setar os parametros não da pra eu setar os parametros da query completa pois pode ser que o usuario tenha escolhido filtros em que a query final tenha ou nao certos parametros, ae digamos que em determinada situação a query solicite o parametro :nome, beleza, eu passo com um setParameter(“nome”), porem, quando a mesma query nao precisar do parametro nome, ou seja, for montada dinamicamente de uma forma q o nome nao seja necessario, o setparameter(“nome”) vai continuar la e vai dar erro pq nao vai encontrar onde setar este parametro na query. como resolver isso?
so um detalhe, SQL Injection é erro de programador, e nao do programa, ou seja, faça seus SQLs com calma =D
Sim eu concordo, mas minha duvida não é mais essa, e sim como usar setParameter em querys dinamicas
Abra outro topico
Não vejo necessidade, ja q este topico parou exatamente na parte onde começou meu problema
[quote=renatomattos2912]Bom dia galera, eu tinha dado como resolvido o problema porem me surgiu uma duvida.
Beleza aprendi com vcs que é possivel usar o setparameter nas querys mesmo escrevendo elas em query nativo e etc, porem minha duvida é quanto a querys dinamicas, ou seja a minha query sera montada de acordo com os filtros que o usuario escolher no site, ou seja, na hora de setar os parametros não da pra eu setar os parametros da query completa pois pode ser que o usuario tenha escolhido filtros em que a query final tenha ou nao certos parametros, ae digamos que em determinada situação a query solicite o parametro :nome, beleza, eu passo com um setParameter(“nome”), porem, quando a mesma query nao precisar do parametro nome, ou seja, for montada dinamicamente de uma forma q o nome nao seja necessario, o setparameter(“nome”) vai continuar la e vai dar erro pq nao vai encontrar onde setar este parametro na query. como resolver isso?[/quote]
Surgiu outra duvida, crie outro topico. Nao é querer pegar no seu pé nao, mas é que assim, como voce, podem existir outras pessoas com a mesma duvida, e ja pensou voce criar 5 duvidas num mesmo topico, depois alguem com a mesma duvida vai atraz de 1 delas mas a dificuldade de encontrar vai ser maior. Sei que voce nao ve necessidade disso, mas nao pense so em voce
Até mais.
Não vejo necessidade, ja q este topico parou exatamente na parte onde começou meu problema[/quote]
É necessário sim, afinal, a dúvida é outra.
Além do que, quando alguém pesquisar por “como evitar sql injection” ou “sql injection e hibernate” vai encontrar este tópico e, caso a pessoa tenha como dúvida “como definir parâmetros dinamicamente no hibernate”, encontrará o novo. Não seja egoísta, não pense apenas em si mesmo.
Mas é algo que resolve exatamente o problema do sql injection, isso completa a minha duvida, ja q me indicaram usar o setParameter pra fazer querys mais seguras justamente pra evitar sqlInjection, entrando aqui o cara com a duvida do sqlInjection saira com a informação completa de como resolver isso. E eu tomo todos os cuidados pra manter os topicos abertos por mim da melhor maneira possivel, sempre os marco como resolvido e sempre deixo a solução explicada, então eu nao penso só em mim, eu até tirei o status de resolvido deste topico por justamente achar que esta minha ultima duvida complementa o objetivo deste topico. Cara não vejo o menor problema em abrir outro topico pra resolver isso, mas como deu pra perceber meu ponto de vista é diferente do seu, não acho q minha ultima duvida nao complemente a primeira, então nao irei abrir outro topico, quem quiser me ajudar por aqui, ajude, se nao quiserem o azar é só meu.
Sua duvida foi se é possivel criar um filtro, o pessoal que lhe apresentou outra solucao, nao tente emendar uma coisa na outra. Enfim, vo mais me meter nisso nao, boa sorte ae pra voce.
Então vamos lá.
Você acha que o título “evitar sql injection” é bastante claro? Eu não. Ele remete à uma série de possíveis dúvidas.
Segundo, este texto
Não é nem um pouco objetivo ou claro.
Terceiro, teu ponto de vista está errado. Vide a necessidade de 3 respostas para descobrirmos que está usando hibernate e não JDBC.
Quarto, qualquer pesquisa no google por “hibernate query parameters” traz ótimos resultados, com exemplos claros. Então, qual o teu problema em entendê-los?
Quinto, Considerando apenas o título “evitar sql injection”, o tópico já foi respondido.
Enfim, algum sujeito metido a besta irá te responder e provavelmente você vai pensar “chupa bando de otário que não quis me responder e pediu pra abrir outro tópico”, enfim.
Pode ter certeza que você entrou na lista das pessoas que eu não respondo jamais.
Então vamos lá.
Você acha que o título “evitar sql injection” é bastante claro? Eu não. Ele remete à uma série de possíveis dúvidas.
Segundo, este texto
Não é nem um pouco objetivo ou claro.
Terceiro, teu ponto de vista está errado. Vide a necessidade de 3 respostas para descobrirmos que está usando hibernate e não JDBC.
Quarto, qualquer pesquisa no google por “hibernate query parameters” traz ótimos resultados, com exemplos claros. Então, qual o teu problema em entendê-los?
Quinto, Considerando apenas o título “evitar sql injection”, o tópico já foi respondido.
Enfim, algum sujeito metido a besta irá te responder e provavelmente você vai pensar “chupa bando de otário que não quis me responder e pediu pra abrir outro tópico”, enfim.
Pode ter certeza que você entrou na lista das pessoas que eu não respondo jamais.[/quote]
- 1 e eu quero é que se …
Cara os topicos mudam seu caminho, minha duvida não era mesmo clara quando perguntei pois era algo q eu não fazia ideia de como resolver e pensei que um filter resolveria, as pessoas q me ajudaram na solução me mostraram que o caminho é outro, concordo agora que o titulo do topico devera ser alterado, aceito sugestões de qual titulo seria melhor, mas continuo com a minha opinião de que minha ultima duvida vai se integrar a solução anterior e quando eu conseguir achar a solução, seja aqui ou no google, é aqui que vou postar, mesmo que isso ja tenha me custado uma blacklist por aqui.
Coloque o seu código atual de como você monta sua query dinâmica e preenche os parâmetros dela.
A forma padrão e simplista é duplicar os ifs de sua lógica: um if para montar a query e outro pra preencher parâmetros.