2016-07-19 12 views
1

Veracode-Bericht zeigt eine SQL-Injektionsfehler für die folgende Abfrage. Es gibt einige Parameter, die ich benötige, um die Eigenschaftendatei zu erhalten und dann in meinen sql zu injizieren, d. H. Schemaname, Sortierreihenfolge .. etc.SQL Injection-Schwachstelle mit Order by-Klausel in JAVA

Ich habe versucht,% s mit String.format zu verwenden, aber veraCode zeigt es immer noch als Fehler an. Für den Parameter ist es in Ordnung, da ich map verwendet habe, aber für Schema und Sortierreihenfolge zeigt es immer noch einen Fehler.

Jeder Ansatz zur Lösung dieser Sicherheitsanfälligkeit?

phoneLogsQuery = "(select * from %s.SHORETEL_EVENTS_CALL_LOGS where CONVERT(date, CallDateTime,112) > CONVERT(date, GETDATE()-%s,112) " 
        + " and (CALLER_CONTACT_ID in (:contactId) or CALLED_CONTACT_ID in (:contactId)) and EXTERNAL_CALL = 1 " 
        + "UNION " 
        + "select * from %s.SHORETEL_EVENTS_CALL_LOGS where CONVERT(date, CallDateTime,112) > CONVERT(date, GETDATE()-%s,112) " 
        + " and (CALLER_CONTACT_ID in (:contactId) or CALLED_CONTACT_ID in (:contactId))" 
        + " and GUILOGIN_NAME = :guiloginName and EXTERNAL_CALL = 0)" 
        + " order by CallDateTime %s %s "; 




     phoneLogsQuery = String.format(phoneLogsQuery, schemaname, phoneLogAllData, schemaname, phoneLogAllData, sortDir, offsetQuery); 
     shoretelPhoneLogRow = jdbcTemplate.query(phoneLogsQuery,params, 
       new ShoretelPhoneLogMapper()); 

Antwort

0

Für Spaltenwerte sollten Sie eine vorbereitete Anweisung verwenden. Es macht Injektion impossible.Example:

jdbcTemplate.query("Select * from user where id=?"), new PreparedStatementSetter() { 
      public void setValues(PreparedStatement preparedStatement) throws SQLException 
      { 
       preparedStatement.setLong(1, id); 
      } 
     }, new ResultSetExtractor<User>() { 
...     
}}); 

Leider für Spaltennamen, Schemanamen usw. Sie nur Verketten oder ersetzen Methode verwenden können:

"SELECT quantity from $tableName where event_id=?".replace("$tableName", "myTable") 

Die Hauptsache, die Sie verstehen sollten, ist, dass die Injektion von Cames Endbenutzer und wenn dieser Schemaname, Tabellenname usw. innere Informationen sind, kann der Endbenutzer sie nicht ändern. Sie sollten also keine Angst vor SQL-Injektion haben.

0

Die meisten dieser Werte können leider nicht durch vorbereitete Anweisungen interpoliert werden, was bedeutet, dass Sie Ihre eigene Flucht durchführen müssen. Nicht sicher, ob Veracode ist intelligent genug, um es zu erkennen, aber ich würde gehen mit StringEscapeUtils.escapeSql von Apache Commons lang

0

Grund Prämisse SQL-Injektionen von Befestigungs ist nicht Ihre Anfrage Objekt direkt zu verwenden, sondern indem man zuerst Hygienisierung, Validierung und die Schaffung neuer Objekte/Verweise (falls erforderlich), um dann Werte von diesem bereinigten Objekt abzurufen.

So einfach erstellen Sie eine Methode zu santisieren, validieren & erhalten Werte, die Sie für Ihre Bestellung von Klausel anfügen möchten und diesen Wert anstelle von direkt aus Anfrage verwenden.

Ein append mit StringBuilder ist in Ordnung, vorausgesetzt, Sie nehmen Werte nicht direkt aus einer nicht bereinigten Anfrage.

Meiner Meinung nach scheinen Sie Ihre% s direkt aus Anfrage zu bekommen und deshalb beschwert sich Veracode.