ferramenta para a detecção de não-parametrizado sql em java jdbc código
-
19-08-2019 - |
Pergunta
Eu estou olhando para inspecionar instruções SQL no código Java / jdbc para garantir que o SQL para ser executado é de qualidade aceitável. Nem PMD não Findbugs parece ter JDBC ou regras SQL. Eu poderia usar p6spy para registrar o SQL e olhar para esse caminho, mas este é manual.
Eu estou querendo saber se a estratégia de de usar PMD / Findbugs / etc para criar uma regra que qualquer string passado para PreparedStatement onde há um "=" ou "in" só vars parametrizada do lado comparar.
Alguém já fez isso? Ou feito isso por outros meios?
Solução
Este é um problema complicado. Os operadores de comparação como =
e IN()
alguns casos, mas há também:. != <> < <= > >= LIKE
Como você detectar casos de interpolação variáveis ??de aplicativo como literais em expressões?
String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";
Você pode procurar SQL contendo delimitadores de cadeia, mas a injeção de SQL não vem apenas de interpolação strings literais.
Como você detectar casos de interpolação variáveis ??de aplicativo como outros do que os valores de dados coisas?
String sql = "SELECT * FROM mytable ORDER BY " + columnname;
Eu não conheço nenhuma maneira automática para detectar falhas de injeção SQL. Código revisão é uma maneira mais eficaz para identificá-los. Em cada instrução SQL que contém variáveis ??de aplicativo interpolados, você precisará confirmar que as variáveis ??de aplicativo são "seguros" e que a sua aplicação validou-los explicitamente ou transformado los para que eles não contêm carga perigosa.
Outras dicas
Você tem a capacidade de testar completamente o aplicativo com um depurador conectado a ele?
Definir um ponto de interrupção na implementação do seu driver JDBC de Connection.createStatement () e executar o aplicativo ... (ou se estiver usando um driver para o qual você não tem o código-fonte, escrever um driver falso que apenas delega chamadas para o real, e registrar todas as ocorrências de createStatement ())