Ищу способ предотвратить использование java.язык SQL.Заявление в проекте


Наша команда стремится к лучшему соблюдению руководящих принципов OWASP, и одной из задач является предотвращение атак с использованием SQL-инъекций. Чтобы облегчить это, я искал способ автоматически проверить использование java.sql.Statement в нашей кодовой базе, чтобы это можно было отметить и изменить на использование PreparedStatement.

Наш процесс сборки основан на Maven, и у нас также есть настройка Sonar для запуска аналитики в проекте. Некоторые правила уже существуют в Сонаре, чтобы провалить наши сборки, если это точно пороговые значения соблюдены, так что это может быть реализовано там. Я видел, где я мог бы настроить правило checkstyle regex, ищущее импорт, но я хотел посмотреть, есть ли и другие варианты.

Любое расположение вдоль пути разработки/сборки будет работать. Если бы в intellij было что-то, что отметило бы это, что-то в процессе сборки maven или другой способ отметить это в Sonar, любой из них был бы прекрасен.

Спасибо!!

3 5

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% местоположений, а затем только постоянно включаете обнаружение, когда вы позаботились о высоких частях загрузки запросов вашего приложения.

Если у вас нет центрального расположения, чтобы обернуть соединение, то вам, возможно, придется обернуть пул соединений или фабрику вверх по цепочке немного.

Надеюсь, это поможет.