Fortify 中解决 SQL 注入的允许方法
Allowed approaches for addressing 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>);
现在,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 = ?"
那么我认为基于 RegEx 的白名单不会起作用。在那种情况下,只有 this example 可以工作,因为它附加了固定在 运行 时间的字符串。我不喜欢这种方法,因为它会导致大量的 switch-case 语句。
谢谢
因此,在尝试上述方法后,我发现 Fortify 仍然是潜在威胁。但是,在了解了 Fortify 的工作原理后,我不确定 "strictness" 是来自 Fortify 本身,还是在 XML 配置文件中定义的公司规则。我认为,如果一个公司的规则允许基于正则表达式的白名单工作,那么这应该可以解决问题。
我有以下用于实现下拉菜单的代码。用户选择两个值,然后根据输入,查询选择要显示给用户的相关列:
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 = ?"
那么我认为基于 RegEx 的白名单不会起作用。在那种情况下,只有 this example 可以工作,因为它附加了固定在 运行 时间的字符串。我不喜欢这种方法,因为它会导致大量的 switch-case 语句。
谢谢
因此,在尝试上述方法后,我发现 Fortify 仍然是潜在威胁。但是,在了解了 Fortify 的工作原理后,我不确定 "strictness" 是来自 Fortify 本身,还是在 XML 配置文件中定义的公司规则。我认为,如果一个公司的规则允许基于正则表达式的白名单工作,那么这应该可以解决问题。