Asumming所有参数都是字符串,我通过这个函数运行所有参数(我禁止在我的网站上使用“|”字符)
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注入的安全方法吗?
答案 0 :(得分:0)
我不会使用这种方法。
目前尚不清楚这是打算解决的问题。我想你是专注于你需要将动态值连接到SQL查询中的想法,直到你宁愿这样做,然后编写一个精心设计的Java方法来提取值,以便将它们用作适当的参数。
你选择了“|”作为分隔符,这意味着您的网站必须禁止包含该字符的任何内容。祝你好运向产品经理或用户解释这个限制。
为什么不直接使用查询参数?
使用每个人都知道的标准解决方案是安全的。在代码审核期间,您可以通过而不是至少保存30分钟来解释您的DynamicParameterizeQuery()方法以及为什么它是安全的以及您的网站无法支持的原因“|”字符。