SQL-Injection verhindern OHNE PreparedStatements

Natac

Bekanntes Mitglied
Liebe Community,

folgende Problemstellung: Ich habe eine Datenbank-Schnittstelle, die auf verschiedene Datenbank-Typen (MySql, Access, etc...) zugreifen können soll.

Nun ist es natürlich so, dass ich bei Nutzung der Schnittstelle eine Sql-Injection verhindern möchte. Die Lösung, auf die ich hier und im Internet für Java immer wieder stoße ist: PrepraredStatements.

Aber leider unterstüzen nicht alle Datenbank-Typen (bspw. MS Access) PreparedStatements und ich kann folglich nicht damit arbeiten, wenn die Schnittstelle allgemein bleiben soll.

Daher benötige ich eine Lösung einen String von einer möglichen Sql-Injection zu "befreien" OHNE PreparedStatements zu nutzen.

Irgendwelche Ideen?
 
S

SlaterB

Gast
"befreien", also ändern musst du die Eingabe ja wohl nicht,
wenn ein böswilliger Angriff vorliegt, dann lohnt sich kaum, einen womöglich legalen Anteil herauszufiltern, vielleicht eh nur Dummy-Daten,

wenn ein nicht bedachtes Problem vorliegt, dann die Daten auch nicht willkürlich (automatisch) kürzen, dann muss die Eingabe überdacht werden

deine Aufgabe besteht doch eher im Erkennen eines Problems,
hast du schon ausführliche Problem-Seiten wie
SQL Injection Attacks by Example
angesehen?

auf gewisse Schlüsselwörter, Semikolon usw. kann man prüfen,
freilich vielleicht im Text selber erlaubt, dann muss man auf korrekte Anführungszeichen und keine im Text selber achten usw.

man kann natürlich auch und sollte wahrscheinlichen einen String-Parameter einfach so als unbehandelten Text nehmen,
dann alle Anführungszeichen darin maskieren wie immer nötig und gesamten Text in Anführungszeichen setzen

PreparedStatement wird letztlich auch nur solche einfachen Schritte ausführen
 
M

maki

Gast
MS-Access unterstützt PreparedStatement IME, allerdings wird der SQL Standard nicht so wirklich ganz unterstützt.. abgesehen davon sollte die JDBC-ODBC Brücke nie produktiv eingesetzt werden.

Alles in allem kann ich dir von MS-Access nur abraten, genauso wie zu versuchen selber SQL INjections zu verhindern.

PreparedStatement arbeiten anders IMHO, da wird "typsicher" konvertiert und damit SQL Injections verhindert, nicht Strings geparst und dann gefiltert.
D.h. dass ein String komplett (eventuell maskiert) an die DB gesendet wird, die Trick mit SQL Injetion funktionieren dann nicht mehr, weil sonderzeichen/spezielle Zeichen maskiert werden.
 
N

nillehammer

Gast
Daher benötige ich eine Lösung einen String von einer möglichen Sql-Injection zu "befreien" OHNE PreparedStatements zu nutzen.

Irgendwelche Ideen?
Du musst bei den eingegebenen Parametern alle Zeichen maskieren, die in dem verarbeitenden Programm (hier SQL) eine Sonderbedeutung haben. Das selbst zu implementieren, ist bestimmt sehr fehleranfällig. Deswegen lieber eine Library für sowas benutzen. In Apache commons-lang gibt es die Klasse StringEscapeUtils (StringEscapeUtils (Commons Lang 2.4 API)). Die kann das.

Ansonsten schließe ich mich den Vorrednern und Tutorials im Internet an und verweise auf PreparedStatement. In der aktuellen Version von Commons-Lang (3) ist aus genau dem Grund auch die Methode escapeSql rausgeflogen.
 
Zuletzt bearbeitet von einem Moderator:

fastjack

Top Contributor
Ich würde vorsichtig sein, bei SQL-Injection auf PreparedStatements zu vertrauen, besonders wenn es DB unabhängig sein soll. Die Implementierung kommt doch vom jeweiligen DB-Provider und das Interface PreparedStatement verpflichtet zu nichts bezüglich SQL-Injections.
 

Natac

Bekanntes Mitglied
Okay, "befreien" war vielleicht nicht der richtige Ausdruck. Erstmal möchte ich es erkennen können. Wie ich dann damit umgehe oder ob man es "escapen" kann, ist dann die eher unkritische Frage.

Alles in allem kann ich dir von MS-Access nur abraten, genauso wie zu versuchen selber SQL INjections zu verhindern.

Tja, wie das Leben so spielt:
a) Es gibt vorhandene Access-Datenbanken, die ich auslesen und beschreiben können muss (btw: suche dazu noch einen möglichs unabhängigen (ohne ODBC?) Treiber für MS Access, der auch Sql versteht)

b) Bin ich ja auch gerne bereit eine Bibliothek zu nutzen, die das übernimmt. Aber wenn selbst die apache.common das rausgenommen hat :(
 
M

maki

Gast
a) Es gibt kommerzielle JDBC Treiber für MS-Access, die sollen besser sein, aber machen auch aus Access keine echte DB.
 

Natac

Bekanntes Mitglied
@Sql + access: Hm... freeware wäre schon schöner. Könnte man nicht einfach über eine MS-Access-Api (bspw. jackcess) eine HSQLDB füllen und diese dann mit Sql abfragen? Wäre zumindest ein Workaround, ohne einen neuen Treiber schreiben zu müssen...


Gibts da echt nirgends eine lib oder eine RegEx, der mir hilft Sql-Injections zu finden? Kann doch nicht sein, dass sich alle Welt auf die PreparedStatements verlässt ???:L
Am Ende muss ich doch ne eigene Methode schreiben, wa!? :(
 

Bernd Hohmann

Top Contributor
Deswegen lieber eine Library für sowas benutzen. In Apache commons-lang gibt es die Klasse StringEscapeUtils (StringEscapeUtils (Commons Lang 2.4 API)). Die kann das.

Die kann was?

Java:
       public static String escapeSql(String str) {
           if (str == null) {
               return null;
           }
           return StringUtils.replace(str, "'", "''");
       }

Ob das ausreicht eine SQL-Injection zu verhindern, da habe ich etwas Zweifel dran.

Bernd
 

Bernd Hohmann

Top Contributor
PreparedStatement arbeiten anders IMHO, da wird "typsicher" konvertiert und damit SQL Injections verhindert, [...]

Nicht mal das. Der Trick besteht einfach darin, dass bei PreparedStatements der SQL-Befehl separat von den Variablen behandelt werden kann. Das eigentliche Statement läuft also durch den SQL-Interpreter, die Variablen jedoch nicht -- und schwupp ist man das Problem mit den Injections los.

PreparedStatements haben noch weitere Vorteile: Die Query kann vorkompiliert und auf Syntax geprüft werden. Weiterhin können "bessere" Datenbanken damit auch den Zugriffpfad auf die Daten besser optimieren (access plan) bzw. der Admin seinen eigenen access plan an die Query binden.

Im OWASP Projekt gibt es Filter um für Legacy-Applikationen Eingabestrings von SQL-Kommandos zu befreien, die Filter gibts aber auch nur für Oracle und MySQL. Keine Chance da was mit MS-Access zu machen.

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

Bernd
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P SQL Injection verhindern ohne z.B. prepareStatement Datenbankprogrammierung 2
B JPA -> Dynamische WHERE Clause / SQL Injection möglich? Datenbankprogrammierung 11
M executeQuery SQL Injection Datenbankprogrammierung 23
G SQL Injection - Wie Eingabe filter? Datenbankprogrammierung 3
Kotelettklopfer SQLite Verhindern von doppelter Statement Ausführung Datenbankprogrammierung 25
F MySQL Doppelte Einträge verhindern Datenbankprogrammierung 2
D Mit Trigger Tupel löschen verhindern Datenbankprogrammierung 3
J OutOfMemoryError - Wie verhindern? Datenbankprogrammierung 4
G H2: Erstellen von Datenbanken verhindern Datenbankprogrammierung 2
G Doppeleinträge in Access auf anderem Weg verhindern. Datenbankprogrammierung 4
G SELECT Name= " " verhindern Datenbankprogrammierung 5
S MongoDB löschung ohne Cascade Datenbankprogrammierung 1
P Derby/JavaDB Datenbanktabelle erweitern, ohne Tabelle zu ändern Datenbankprogrammierung 6
D OpenJPA Zeichenvorrat in DB & Fremdschlüssel ohne Entität Datenbankprogrammierung 5
B Inner Join ohne SQL Syntax Datenbankprogrammierung 2
M MySQL Verbindung zum Server aufbauen ohne DB ansprechen Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
X MySQL DB-verbindung ohne JDBC/ODBC Datenbankprogrammierung 1
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
eskimo328 Datenbankverbindung ohne Passwort im Quelltext bei einer offline Anwendung Datenbankprogrammierung 14
Kenan89 Insert ohne Auswirkung Datenbankprogrammierung 7
D MySQL User mit nur mit lokalen Lesezugriff und ohne Phpmyadmin Datenbankprogrammierung 4
J Derby/JavaDB Zugriff ohne Entwicklungsumgebung Datenbankprogrammierung 5
M MySQL Bilddatei in MYSQL DB abspeichern, ohne lokal auf HDD zwischenzuspeichern Datenbankprogrammierung 3
Screen Ich suche eine SQLDatenbank ohne JDBC-Treiber Datenbankprogrammierung 12
T mdb Verbindung ohne Registrierung der Datenquelle im OS Datenbankprogrammierung 14
V MySQL MsSql ohne Server nutzen? Datenbankprogrammierung 2
NoXiD Access Datenbank in java einbinden ohne ODBC treiber zu erstellen Datenbankprogrammierung 5
T MySQL Zugriff ohne Angabe der Datenbank Datenbankprogrammierung 3
B MySQL-Dumpdatei ohne Batchdatei wieder einlesen Datenbankprogrammierung 48
M Mysql Delete ohne Where Klausel untersagen Datenbankprogrammierung 8
P JPA Datenbanksettings ohne persistence.xml Datenbankprogrammierung 3
E DB installieren ohne Installationsroutine Datenbankprogrammierung 4
V Delete From Tabelle, ohne vorher die Tabelle zu kennen Datenbankprogrammierung 5
P Datenbank für Java Anwendung wie SQLite ohne Installation Datenbankprogrammierung 4
M MySQL: Spalte auf einmal füllen, ohne iterieren zu müssen Datenbankprogrammierung 4
S Datenbank zugriff optimieren - zugriff ohne cursor? Datenbankprogrammierung 7
J HSQLDB ohne JDBC Datenbankprogrammierung 8
L einfache Datenbankabfrage ohne erstes Element Datenbankprogrammierung 2
D An Access Datenbank andocken ohne sie beim System anzumelden Datenbankprogrammierung 3
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
G Access mit Java OHNE ODBC Datenbankprogrammierung 7
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4
G Datenbank ohne Server Datenbankprogrammierung 28
C Datenbankanbindung ohne ODBC JDBC Brücke Datenbankprogrammierung 5
R Datenbank ohne Installation (Multiuser) Datenbankprogrammierung 9
E jdbc Verbindung ohne Einrichten einer DSN möglich ? Datenbankprogrammierung 3
clemson [SQL] Abfrage --> alle Gruppen, ohne MailConfig Datenbankprogrammierung 10
O Datenbankzugriff "ohne" Server ? Datenbankprogrammierung 9
A Java und Accessdateien ohne ODBC? Datenbankprogrammierung 2

Ähnliche Java Themen


Oben