表名動態生成拼接到sql語句的sql注入問題
阿新 • • 發佈:2018-11-26
背景:根據業務需要,每個月生成一張根據年份和月份的表,然後當前的資料存到當前月份的表。
關鍵程式碼如下:
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();