代码改变世界

[hyddd的Fortify SCA分析Java代码记录][Semantic]SQL Injection

2009-02-26 18:50  hyddd  阅读(1531)  评论(0编辑  收藏

先看一段代码:

private String getInsertSql(Map<String, Object> parameterValues) {
        StringBuffer insertSql 
= new StringBuffer();
        StringBuffer fieldsSql 
= new StringBuffer();
        StringBuffer valuesSql 
= new StringBuffer();

        insertSql.append(
"INSERT INTO ");
        insertSql.append(parameterValues.get(
"__TableName")); //有可能注入了。
        insertSql.append(" ");

        Set
<String> keys = parameterValues.keySet();
        
for (String key : keys) {
                
if (key.equals("__TableName"|| key.equals("__Key"|| key.equals("__Value")) {
                        
continue;
                }
                fieldsSql.append(String.format(
",%s", key));
                valuesSql.append(
",?");
        }
        fieldsSql.deleteCharAt(
0);
        valuesSql.deleteCharAt(
0);
        insertSql.append(String.format(
"(%s) VALUES (%s)", fieldsSql.toString(), valuesSql.toString()));
        
return insertSql.toString();
}

在代码注释处可能出现SQL注入,如果parameterValues.get("__TableName")的值是一段注入用的SQL语句,至少,在这种情况下就有问题了,现在一般防止SQL注入的方法是使用:prepareStatement

PreparedStatement ps = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?");
ps.setString(
1,'Dettinger');