1
我有以下用於實現下拉菜單的代碼。用戶選擇兩個值,並且,基於所述輸入,所述查詢選擇相關列能夠被顯示給用戶:允許在Fortify中處理SQL注入的方法
String sql = "SELECT :first, :second from <table>";
sql = sql.replace(":first", <first_user_input>);
sql = sql.replace(":second", <second_user_input>);
現在,Fortify的捕捉這些行作爲允許SQL注入。我的問題是,Fortify是否接受基於RegEx的白名單方案作爲解決方案?
我想採取以下做法:
if(isValidSQL(<first_user_input>) && isValidSQL(<second_user_input>))
{
sql = sql.replace(...);
}
else
throw new IllegalSQLInputException
和
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);
}
所以,將Fortify的接受這個作爲一個有效的白名單的方法?如果Fortify的工作在下面的語法:
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 = ?"
那麼我不認爲基於正則表達式,白名單會工作。在這種情況下,只有this example可以工作,因爲它追加了在運行時修復的字符串。我不會喜歡這種方法,因爲它會導致大量的開關事件陳述。
謝謝