# SQL Injection verhindern ohne z.B. prepareStatement



## Presler (30. Mai 2012)

Mir ist schon klar das man SQL Injection am einfachsten verhinden kann durch z.B.


```
stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
stmt.setString(1, name);
stmt.setString(2, email);
```

bzw. in Spring

```
getSimpleJdbcTemplate()             .update(                     
"insert into table "                             + 
"(column1, column2, column3, column4, column5) VALUES "                             + 
"(:column1, :column2, :column3, :column4, :column5)",                     
new MapSqlParameterSource().addValue("column1",  value1).
addValue("column2",                             value2).
addValue("column3",                             value3).
addValue("column4",                             value4).
addValue("column5", value5));
```

Aber ich suche eine Möglichkeit mit der man in Java (mit oder ohne Spring Framework) mir einen einzelnen Wert vor SQL Injection schützt also in der Form:

angelehnt an Beispiel 1:

```
String sql = "INSERT INTO person (name, email) values (" + 
                    sqlinjectionsafe(name) + ", " +  sqlinjectionsafe(email) + ")");
```

angelehnt an Beispiel 2:

```
String sql = "INSERT INTO person (name, email) values (" + 
                      sqlinjectionsafe(name) + ", " +  sqlinjectionsafe(email) + ")");

getSimpleJdbcTemplate().update( sql ); // String sql ist jetzt sql injection sicher
```

Wie könnte man soetwas realisieren? Gibt es evtl. eine solche Funktion schon?


----------



## maki (30. Mai 2012)

Sowas git es, nennt sich eben PreparedStatement, was spricht denn dagegen es zu verwenden?
Ansonsten kannst du immer deine eigene Konvertierungs-/Maskierungsroutine schreiben, allerdings ist die Chance dass diese eben Fehler enthält  und damit nicht wirklich vor SQL Injections schützt recht hoch.


----------



## Gast2 (30. Mai 2012)

Wenn du sehr genau weißt was du erwartest wäre es denkbar, z.B. wenn du eine PLZ erwartest kannst du mit einer RegEx prüfen das es nur 5 Zahlen sind. 

Aber generell? Nein! Erst recht bei Textdaten solltest du das lassen und dich am besten komplett bei allem auf die PreparedStatements verlassen.


----------

