Os ataques de injeção de SQL são possíveis no JPA?
-
27-09-2019 - |
Pergunta
Estou construindo um aplicativo Java Web usando Java EE 6 e JSF-2.0, usando a API de persistência para todas as operações de banco de dados.
O back-end é MySQL, mas usei as funções EntityManager e consultas nomeadas em EJB-QL para todas as operações.Os ataques de injeção de SQL são possíveis neste caso?
Solução
Isso só é possível se você estiver incorporando variáveis controladas pelo usuário em uma string SQL/JPQL da seguinte forma:
String sql = "SELECT u FROM User u WHERE id=" + id;
Se você não estiver fazendo isso e estiver usando apenas consultas parametrizadas/nomeadas, estará seguro.
Outras dicas
Sim, é possível.Depende da maneira como você implementa.
Dê uma olhada em Prevenindo injeção na linguagem de consulta JPA.
Se o seu provedor JPA processar todos os argumentos de entrada para lidar com ataques de injeção, você deverá estar protegido.Fazemos thin no EclipseLink.
Como o postador anterior mencionou, reunir seu próprio JPQL ou SQL (para consultas nativas) pode expor você.
Eu recomendaria usar consultas nomeadas com parâmetros em vez de concatenar strings para construir JPQL/SQL.
Douglas
Caso você esteja perguntando de uma perspectiva prática/ofensiva, se uma instrução JPQL for construída a partir da entrada do usuário, considere a seguinte entrada do usuário:
blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42
Se a vítima estiver usando uma implementação JPA >= 2.1 e o banco de dados backend for Oracle, algo como o acima pode atuar como uma injeção SQL booleana para informar se o usuário do banco de dados começa com 'A'.