【发布时间】:2018-08-13 13:50:43
【问题描述】:
假设所有参数都是字符串,我通过这个函数运行所有参数(我禁止在我的网站上使用“|”字符)
public String EscapeParameter(String Param)
{
return "|" + param.replace("|", "") + "|"
}
这样的参数化查询是一种安全的方法吗?在这一点上,我确定所有参数都以“|”开头并以“|”结尾那么我可以遍历字符串并参数化查询,而不管它最初是如何构建的吗?
public String DynamicParameterizeQuery(String sql)
{
int stringSize = sql.length();
StringBuilder paraValueBuilder = new StringBuilder();
Boolean inParam = false;
StringBuilder sb = new StringBuilder();
Map<String, String> paramMap = new HashMap<String, String>();
for(int i = 0; i < stringSize; i++)
{
Character currentChar = sql.charAt(i);
if(currentChar == '|' && inParam == false)
{
inParam = true;
}
else if(currentChar == '|' && inParam == true)
{
inParam = false;
paramMap.put(":" + i*1000, paraValueBuilder.toString());
sb.append(":" + i*1000 + " ");
paraValueBuilder = new StringBuilder();
}
else
{
sb.append(currentChar);
}
}
getRows(sql, paramMap);
}
/**
* Gets a list of objects <T> from the database.
*
* @param <T> object type to be returned
* @param sql query to execute
* @param objectParameters query parameter values
* @param targetClass target class that will be returned. <T>
* @return A list of the specified objects.
*/
public <T> List<T> getRows(String sql, Object objectParameters, Class<T> targetClass) {
RowMapper<T> rowMapper = new BeanPropertyRowMapper<T>(targetClass);
return getRows(sql, objectParameters, rowMapper);
}
这是防止 SQL 注入的安全方法吗?
【问题讨论】:
-
在可以使用适当的 SQL 参数的情况下,不清楚为什么需要这样做?
-
这个例子确实使用了正确的 SQL 参数,它只是在事后添加它们?
-
你能展示一个使用你的函数的例子吗? SQL 查询会是什么样子?另外,我不熟悉“@”标记作为参数占位符,我习惯于简单的
?占位符。此外,我从未见过采用 Map 对象的executeQuery()版本。你在用什么? -
我说的是用某种分隔符来包装用户输入的参数,例如一个条形 public String EscapeParameter(String Param) { return "|" + param.replace("|", "") + "|" } 然后重新创建一个参数化查询
-
我已经更新了问题,它是 GenericJdbcDaoSupport,(它内置于)Spring
标签: java oracle jdbc parameters sql-injection