Frage Suche nach einer Möglichkeit, die Verwendung von java.sql.Statement im Projekt zu verhindern


Unser Team ist bestrebt, die OWASP-Richtlinien besser einzuhalten, und eine der Aufgaben ist die Vermeidung von SQL-Injection-Angriffen. Um dies zu erleichtern, suchte ich nach einer Möglichkeit, automatisch auf die Verwendung von zu prüfen java.sql.Statement in unserer Codebasis, so könnte dies markiert und geändert werden, um zu verwenden PreparedStatement.

Unser Build-Prozess basiert auf Maven und wir haben Sonar-Setup, um Analysen für das Projekt durchzuführen. Einige Regeln sind bereits in Sonar implementiert, um unsere Builds zu unterbinden, wenn bestimmte Schwellenwerte erreicht werden, sodass dies dort implementiert werden könnte. Ich habe gesehen, wo ich eine Checkstyle-Regex-Regel einrichten könnte, die nach dem Import sucht, aber ich wollte sehen, ob es auch andere Optionen gibt.

Jede Position entlang des Entwicklungs- / Build-Pfads funktioniert. Wenn es etwas intellij gäbe, das dies kennzeichnen würde, etwas im Maven-Build-Prozess oder eine andere Art, dies in Sonar zu kennzeichnen, wäre alles in Ordnung.

Vielen Dank!!


5
2018-01-16 16:11


Ursprung


Antworten:


ich würde vorschlagen Erstellen einer architektonischen Einschränkung in Sonar.

Das Beispiel demonstriert eine Regel, die die Verwendung von * java.sql. ** - Klassen verbietet.


7
2018-01-17 00:23



Ich habe es nicht benutzt, aber PMD sieht so aus, als wäre es ein gutes Werkzeug dafür.


1
2018-01-16 16:29



Anstatt die Klassennutzung zu erkennen, könnten Sie stattdessen ihre Generierung mit einem java.sql.Connection Proxy? Wenn Sie Ihre Verbindung von der Fabrik erhalten, würden Sie sie in Ihren Proxy einbinden. Ihr Proxy würde instrumentiert werden, um Methodenaufrufe auszuführen, Abfragezeichenfolgen zu protokollieren und / oder über Stack-Traces zu berichten, wenn Benutzer sie verwenden createStatement() oder andere Off-Limit-Anrufe.

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();
    }

Wenn Sie nicht zu schwer in der Produktion werden wollen, dann können Sie sie immer zählen und haben eine volatile boolean logBadCall Typ des Flags, um die Überprüfung nur für einen bestimmten Zeitraum zu ermöglichen, um nach Problemen zu suchen. Vielleicht machen Sie zunächst Stichproben, greifen die 80% -Standorte an und haben dann nur dann dauerhaft die Erkennung, wenn Sie sich um die hohen Abfragewerte Ihrer Anwendung gekümmert haben.

Wenn Sie keinen zentralen Speicherort zum Umbrechen der Verbindung haben, müssen Sie möglicherweise den Verbindungspool oder die Factory um die Kette ein wenig herumwickeln.

Hoffe das hilft.


0
2018-01-16 23:02