Ich habe den folgenden Code zum Implementieren eines Dropdown-Menüs. Der Benutzer wählt zwei Werte, und, basierend auf der Eingabe wählt die Abfrage, um die entsprechenden Spalten an die Benutzer angezeigt werden:Erlaubte Ansätze zum Adressieren von SQL Injection in Fortify
String sql = "SELECT :first, :second from <table>";
sql = sql.replace(":first", <first_user_input>);
sql = sql.replace(":second", <second_user_input>);
Nun Fortify fängt diese Zeilen als SQL-Injektion erlaubt. Meine Frage ist, Fortify akzeptieren eine RegEx-basierte Whitelisting-Ansatz als Lösung?
ich die Annahme des folgenden Ansatz dachte:
if(isValidSQL(<first_user_input>) && isValidSQL(<second_user_input>))
{
sql = sql.replace(...);
}
else
throw new IllegalSQLInputException
und
public boolean isValidSQL(String param)
{
Pattern p = Pattern.compile([[A-Z]_]+); //RegEx for matching column names like "FIRST_NAME", "LNAME" etc. but NOT "DROP<space>TABLE"
Matcher m = p.matcher(param);
return m.matches(param);
}
So würde dies als eine Methode gültig Whitelisting Fortify akzeptieren? Wenn Fortify auf der unten Grammatik funktioniert:
valid_sql := <immutable_string_literal> //Something like "SELECT * FROM <table> WHERE x = ?" or //SELECT * FROM <table>
valid_sql := valid_sql + valid_sql //"SELECT * FROM <table>" + "WHERE x = ?"
dann nehme ich nicht-RegEx basierte Whitelisting funktionieren würde. In diesem Fall würde nur this example funktionieren, da es Zeichenfolgen anfügt, die zur Laufzeit festgelegt sind. Ich würde diesen Ansatz nicht bevorzugen, da dies zu einer massiven Anzahl von Switch-Case-Anweisungen führen würde.
Danke