前言
最近遇到專案被 Checkmarx 掃出 Heuristic_2nd_Order_SQL_Injection
的低風險問題。
看了一下程式,它的邏輯是在 MVC 的 Controller 接收一個 No 字串參數,再透過該參數到 DB 中取回單號的年度,
再依年度組出檔案路徑,進行檔案的操作。
才一個 DB 的 Query ,怎麼會疑似有 2nd Order SQL Injection 問題呢?
研究
針對 SQL Injection 的防護,大多使用 Parameter 的方式,
而該 Query 也是使用 DbParameter 的方式,
為什麼 Checkmarx 會覺得有 Injection 的問題呢?
程式是使用 Dapper 的 SqlMapper 來 Query
1 | //Controller |
從 Checkmarx 的圖中,經過的 Path 只有一個 DB 的 Query,
而且 SQL 的參數,也沒有使用 字串 串接的方式,
所以沒有 2nd Order SQL Injection 的問題。
有可能是 Checkmarx 不認得 SqlMapper.Query
的擴充 Method。
將 Dapper 改用 Ado.NET 來操作,
1 | public string GetPlanYear(string SRNO) |
再掃一次 Heuristic_2nd_Order_SQL_Injection
就不會再出現。
如果客戶可以接受說明,應該可以不需要進行調整,
如果一定要調整的話,除了改用 Ado.NET 方式外,
也可以透過驗證資料型別的方式來解,
例如,判斷是否為 int 再將值傳出,如下,
1 | public string GetPlanYear(string SRNO) |
參考資源
What is a Second-Order SQL Injection and how can you exploit it successfully?