Ищу способ предотвратить использование java.язык SQL.Заявление в проекте
Наша команда стремится к лучшему соблюдению руководящих принципов OWASP, и одной из задач является предотвращение атак с использованием SQL-инъекций. Чтобы облегчить это, я искал способ автоматически проверить использование java.sql.Statement
в нашей кодовой базе, чтобы это можно было отметить и изменить на использование PreparedStatement
.
Наш процесс сборки основан на Maven, и у нас также есть настройка Sonar для запуска аналитики в проекте. Некоторые правила уже существуют в Сонаре, чтобы провалить наши сборки, если это точно пороговые значения соблюдены, так что это может быть реализовано там. Я видел, где я мог бы настроить правило checkstyle regex, ищущее импорт, но я хотел посмотреть, есть ли и другие варианты.
Любое расположение вдоль пути разработки/сборки будет работать. Если бы в intellij было что-то, что отметило бы это, что-то в процессе сборки maven или другой способ отметить это в Sonar, любой из них был бы прекрасен.
Спасибо!!
3 ответа:
Я бы предложил создать архитектурное ограничение внутри сонара.
Пример демонстрирует правило, запрещающее использование * java.язык SQL.** учебные занятия.
Я не использовал его, но PMD похоже, что это может быть хорошим инструментом для этого.
Вместо обнаружения использования классов, не могли бы вы вместо этого обнаружить их генерацию с помощью прокси
java.sql.Connection
? Когда вы получаете соединение с завода, вы должны завернуть его в свой прокси-сервер. Ваш прокси-сервер будет инструментован для вызова методов, строк запросов журнала и / или отчетов о трассировках стека, когда люди используютcreateStatement()
или другие запрещенные вызовы.public class ProxyConnection implements Connection { private Connection realConnection; public ProxyConnection(Connection realConnection) { this.realConnection = realConnection; } public Statement createStatement() throws SQLException { // could the offenders createCounter.incrementAndGet(); // log the callers -- expensive so maybe every 100th or every 10 secs logger.info("call to createStatment", new Exception("createStatement")); // maybe just throw if (throwOnBadCall) { throw new SQLException("calls to createStatement aren't allowed")); } return realConnection.createStatement(); }
Если вы не хотите быть слишком тяжелым в производстве, то вы всегда можете пересчитать их и иметь тип флага
volatile boolean logBadCall
, чтобы только включить проверка в течение определенного периода времени для выборки ищет проблемы. Возможно, первоначально вы делаете некоторую выборку, атакуете 80% местоположений, а затем только постоянно включаете обнаружение, когда вы позаботились о высоких частях загрузки запросов вашего приложения.Если у вас нет центрального расположения, чтобы обернуть соединение, то вам, возможно, придется обернуть пул соединений или фабрику вверх по цепочке немного.
Надеюсь, это поможет.