Sql injection Fortify中允许的SQL注入寻址方法

Sql injection Fortify中允许的SQL注入寻址方法,sql-injection,fortify,whitelist,Sql Injection,Fortify,Whitelist,我有以下实现下拉菜单的代码。用户选择两个值,查询根据输入选择要向用户显示的相关列: String sql = "SELECT :first, :second from <table>"; sql = sql.replace(":first", <first_user_input>); sql = sql.replace(":second", <second_user_input>); String sql=“选择:第一,第二”; sql=sql.replac

我有以下实现下拉菜单的代码。用户选择两个值,查询根据输入选择要向用户显示的相关列:

String sql = "SELECT :first, :second from <table>";
sql = sql.replace(":first", <first_user_input>);
sql = sql.replace(":second", <second_user_input>);
String sql=“选择:第一,第二”;
sql=sql.replace(“:first”,);
sql=sql.replace(“:second”,);
现在,Fortify将这些行捕获为允许SQL注入。我的问题是,Fortify会接受基于RegEx的白名单方法作为解决方案吗?

我正在考虑采取以下方法:

if(isValidSQL(<first_user_input>) && isValidSQL(<second_user_input>))
{
    sql = sql.replace(...);
}
else
    throw new IllegalSQLInputException
if(isValidSQL()&&isValidSQL())
{
sql=sql.replace(…);
}
其他的
抛出新的非法SQLInputException

公共布尔值isValidSQL(字符串参数)
{
Pattern p=Pattern.compile([[A-Z]]+);//RegEx用于匹配列名,如“FIRST_NAME”、“LNAME”等,但不用于“DROPTABLE”
匹配器m=p.Matcher(参数);
返回m.matches(参数);
}
因此,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 = ?"
valid\u sql:=//类似于“从x=?”或//从中选择*
valid_sql:=valid_sql+valid_sql//“从“+”中选择*,其中x=?”
那么我认为基于RegEx的白名单是行不通的。在这种情况下,只有这样才能工作,因为它附加了在运行时固定的字符串。我不喜欢这种方法,因为它会导致大量的switch case语句


谢谢

所以,在尝试了上述方法之后,我发现Fortify仍然是一个潜在的威胁。然而,在阅读了Fortify的工作原理之后,我不确定“严格性”是来自Fortify本身,还是来自XML配置文件中定义的公司规则。我认为,如果一个人的公司规则允许基于正则表达式的白名单工作,那么这就应该起作用

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 = ?"