前言
在前篇 Checkmarx Unsafe_Reflection 是依 if + 白名單 + Contains 的方式來處理,
但 Checkmarx 更版後,就沒辦法成功了,怎麼辦呢?
- 環境: Checkmarx 版本:V 9.5.5.1007 HF14
- 類別:Unsafe Reflection
- 嚴重程度:高風險
解法
Checkmarx 最新的 Rule 如下,
1 | CxList inputs = Find_Inputs(); |
在上面程式中,可以發現,if + 白名單 + Contains還是存在的,
而另一個確定的做法是轉成 Int (如果轉 int 可以,那 GUID 也應該可以才對)。
有問題的程式類似如下,是一個 WebService 程式,
主要是依 reportId 來取得報表範本,並產生報表。
1 | public ResponseData ReportServiceInData(string reportId, string user, DataSet data) |
因為有轉 int 的 rule 在,所以可以檢查一下 reportId 是不是有固定的命名規則,
有的話,就先將它轉成 int 後,再組回來,就可以解掉問題。
例如 reportId 為 R001, R002, R003 …
所以就可以將 reportId 去掉 R ,轉成 int ,再組回去就行了,
傳給factory.CreateReportGenerator
就是轉過 int
的 newRptId
如下,
1 | public ResponseData ReportServiceInData(string reportId, string user, DataSet data) |
當然,以上僅在規則中調整,最好當然將 Assembly.LoadFile
改掉。
參考資源
一文錢買個糖人(吃了沒玩的,玩了沒吃的):喻人對某一件事,處於取捨兩難之間,一時無法抉擇的意思