Domanda

Sto cercando di ispezionare le istruzioni SQL nel codice Java / jdbc per assicurarmi che l'SQL da eseguire sia di qualità accettabile. Né PMD né Findbugs sembrano avere regole JDBC o sql. Potrei usare p6spy per registrare l'SQL e guardare in quel modo, ma questo è manuale.

Mi chiedo se la strategia di usare PMD / Findbugs / etc per creare una regola che qualsiasi stringa sia passata a PreparedStatement dove c'è un " = " oppure " in " ha solo parametrizzato var sul lato del confronto.

Qualcuno l'ha fatto? O fatto con altri mezzi?

È stato utile?

Soluzione

Questo è un problema difficile. Operatori di confronto come = e IN() sono alcuni casi, ma c'è anche: != <> < <= > >= LIKE.

Come si individuano i casi di interpolazione delle variabili dell'applicazione come letterali nelle espressioni?

String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";

Potresti cercare SQL contenente delimitatori di stringa, ma l'iniezione SQL non proviene solo dall'interpolazione dei valori letterali delle stringhe.

Come individueresti casi di interpolazione di variabili applicative come cose diverse dai valori di dati?

String sql = "SELECT * FROM mytable ORDER BY " + columnname;

Non conosco alcun modo automatico per rilevare i difetti di iniezione SQL. La revisione del codice è un modo più efficace per individuarli. In ogni istruzione SQL che contiene variabili dell'applicazione interpolate, è necessario confermare che le variabili dell'applicazione sono & Quot; safe & Quot; e che la tua app li ha esplicitamente convalidati o trasformati in modo che non contengano payload pericolosi.

Altri suggerimenti

Hai la possibilità di testare completamente l'applicazione con un debugger collegato ad essa?

Imposta un punto di interruzione nell'implementazione del tuo driver JDBC di Connection.createStatement () ed esegui l'app ... (o se usi un driver per il quale non hai il codice sorgente, scrivi un driver falso che delega solo le chiamate a quello vero e registra tutte le istanze di createStatement ())

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top