前台传来的值如果不经过处理直接进入数据库执行的话,有很大的风险,例如,有人恶意传值 ’;drop table xxxx--的话,xxxx这张表直接就没了。
下面举一个危害不大的例子:
select * from user_table where username=''and password= ''
假设我们在前端的user框里面输入'or 1=1--的话,这句sql就会变成
select * from user_table where username='' or 1=1--'and password= ''
这样密码无论输入什么都能登录成功了
注:在数据库里面--是注释的意思,也就是说后面的and password= ''等于没有
所有前台传来的值都得用prepare statement进行预处理。
对于一个name对应一个值的情况,直接获取值放进List,举例如下:
List<Object> paraList = new ArrayList<Object>()
String counter = map.get("counter") == null ? "" : map.get("counter").toString();
//再在sql的结尾加上
if (!counter.isEmpty()) {
builder.append("\n and s.code = ?");
paraList.add(counter);
}
//return的时候带上paraList.toArray()
return getJdbcTemplate().queryForInt(builder.toString(), paraList.toArray());
对于前台一个name对应多个值的情况参考下面这篇文章
根据前台传值的数量动态插入?,?..
网友评论