強型別資料集(Typed DataSet)我已經很久沒用了,不過還是有些舊案子還在維護多少會用到,今天在寫程式時發現有個非常詭異的現象,研究出來後才發現這可能會引發一些潛在的資安問題,因此寫起來提醒各位。
我有個強型別資料集 (Typed DataSet) 的 Typed DataTable,該表格的 Primary Key 欄位長度為 10,在資料庫中定義的欄位是 Varchar2(10) [ 備註: 我這次用的是 Oracle 資料庫,但此陷阱應該跟 DB 無關 ]
當我利用 Typed TableAdapter 進資料庫查詢時,剛好傳入的 ID 長度為 10,例如:
ta.GetDataByID("A12345679");
而資料庫中也正好有 A123456789 這筆資料,所以資料可以正常取回。
但是當我測試輸入一個不存在的 ID 值時,竟然也回傳資料,如下範例:
ta.GetDataByID("A123456790");
ta.GetDataByID("A12345679ABCDE");
ta.GetDataByID("A12345679------");
ta.GetDataByID("A12345679A12345679");
很詭異吧!
我查看了一下我的 Typed TableAdapter 中定義的參數清單,發現我傳入的 ID 參數大小也設定為 10
最後我才發現,只要傳入的資料超過參數設定的 Size 上限就會自動被截斷,然後才傳入資料庫查詢,雖然資料庫收到的只有前 10 個字元,但在你原本的 .NET 程式若也有用到這個傳入參數時,你可能不會料想到會有這種行為,也很可能會發生未預期的錯誤發生。
例如你若透過強型別資料集提供的方法進行驗證登入是否成功,驗證過後就以登入的帳號對資料庫進行操作,雖然驗證通過,但帳號卻是錯誤的,這時就不知道會發生什麼事了。
雖然不是什麼嚴重的問題,但你也可能跟我一樣覺得很困惑(confuse),所以在寫程式時可能要特別注意。