инструмент для обнаружения непараметрического SQL в коде Java JDBC

StackOverflow https://stackoverflow.com/questions/342290

Вопрос

Я хочу проверить операторы SQL в коде Java / jdbc, чтобы убедиться, что выполняемый SQL имеет приемлемое качество. Похоже, что ни PMD, ни Findbugs не имеют правил JDBC или sql. Я мог бы использовать p6spy для входа в SQL и посмотреть на это, но это руководство.

Мне интересно, есть ли стратегия использования PMD / Findbugs / etc для создания правила, согласно которому любая строка передается в PreparedStatement, где есть " = " или " in " имеет только параметризованные переменные на стороне сравнения.

Кто-нибудь делал это? Или сделали это другими способами?

Это было полезно?

Решение

Это сложная проблема. В некоторых случаях такие операторы сравнения, как = и IN(), также есть: != <> < <= > >= LIKE.

Как вы определяете случаи интерполяции переменных приложения как литералов в выражениях?

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

Вы можете искать SQL, содержащий разделители строк, но внедрение SQL происходит не только из интерполяции строковых литералов.

Как бы вы обнаружили случаи интерполяции переменных приложения как вещи, отличные от значений данных?

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

Я не знаю ни одного автоматического способа обнаружения недостатков SQL-инъекций. Проверка кода - более эффективный способ обнаружить их. В каждом операторе SQL, который содержит интерполированные переменные приложения, вы должны подтвердить, что переменные приложения являются & Quot; safe & Quot; и что ваше приложение явно проверило их или преобразовало так, чтобы они не содержали опасного содержимого.

Другие советы

У вас есть возможность полностью протестировать приложение с подключенным к нему отладчиком?

Установите точку останова в реализации Connection.createStatement () вашего драйвера JDBC и запустите приложение ... (или, если вы используете драйвер, для которого у вас нет исходного кода, напишите поддельный драйвер, который просто делегирует вызовы реальный, и регистрируйте все экземпляры createStatement ())

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top