表名动态生成拼接到sql语句的sql注入问题

背景:根据业务需要,每个月生成一张根据年份和月份的表,然后当前的数据存到当前月份的表。

关键代码如下:

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();
sb.append("insert into tabsaveevent").append(strYear).append(strMonth);
sb.append(" (id,serializeObj,methodName,createTime,tcode,orginSystem,ptxId,businessNo,aopType,occurTime) values (?,?,?,?,?,?,?,?,?,?)");
String sqlSave = sb.toString();

猜你喜欢

转载自blog.csdn.net/dhklsl/article/details/84109434