背景:根据业务需要,每个月生成一张根据年份和月份的表,然后当前的数据存到当前月份的表。
关键代码如下:
String tabName = "tabsaveevent" + strYear + strMonth;
String sqlSave = "insert into " + tabName + " (id,serializeObj,methodName,createTime,tcode,orginSystem,ptxId,businessNo,aopType,occurTime) values (?,?,?,?,?,?,?,?,?,?)";
这时候就设计到sql注入了,存在漏洞。
解决方案有下面四种:
1、把表名单独存在一张表中,然后利用查询语句查询出表名,把该查询语句放到原sql中,有效防止了sql注入(不推荐)
缺点:增加了一次写表和读表,效率不高。
2、利用存储过程,把SQL语句写在数据库的存储过程中。
缺点:需要提前根据年份和月份手动建好表
3、建三张表tabA,tabB,tabC;tabA表存单月数据,tabB表存双月数据,
然后单月时把tabB中数据转存到tabC,双月时把tabA数据转存到tabC。表名固定,避免了表名拼接。
缺点:数据转储时如果单表数据量大,可能会拖垮数据库。
4、利用stringbuffer拼接sql语句,有效防止了sql注入。(推荐)
第四种解决方案如下:
StringBuffer sb = new StringBuffer(); ("insert into tabsaveevent").append(strYear).append(strMonth); (" (id,serializeObj,methodName,createTime,tcode,orginSystem,ptxId,businessNo,aopType,occurTime) values (?,?,?,?,?,?,?,?,?,?)"); String sqlSave = ();