Это сложная проблема. В некоторых случаях такие операторы сравнения, как =
и IN()
, но также: != <> < <= > >= LIKE
.
Как вы определяете случаи интерполяции переменных приложения как литералов в выражениях?
String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";
Вы можете искать SQL, содержащий разделители строк, но SQL-инъекция происходит не только от интерполяции строковых литералов.
Как бы вы охарактеризовали случаи интерполяции переменных приложения как вещи, отличные от значений данных?
String sql = "SELECT * FROM mytable ORDER BY " + columnname;
Я не знаю ни одного автоматического способа обнаружения недостатков SQL-инъекций. Проверка кода - более эффективный способ обнаружить их. В каждом операторе SQL, который содержит интерполированные переменные приложения, вы должны подтверждать, что переменные приложения являются «безопасными» и что ваше приложение явно проверило их или преобразовало так, чтобы они не содержали опасной полезной нагрузки.