1. 程式人生 > >表名動態生成拼接到sql語句的sql注入問題

表名動態生成拼接到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();