2016-12-09 46 views
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可以工作,因爲它追加了在運行時修復的字符串。我不會喜歡這種方法,因爲它會導致大量的開關事件陳述。

謝謝

回答

1

所以,嘗試上述方法後,我發現,Fortify的仍是追趕線作爲潛在的威脅。然而,在閱讀Fortify的工作原理之後,我不確定「嚴格性」是來自Fortify本身,還是XML配置文件中定義的公司規則相同。我認爲,如果一個公司的規則允許正則表達式的白名單工作,那麼這應該是有用的。