The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

使用強型別資料集(Typed DataSet)需注意欄位長度的陷阱

強型別資料集(Typed DataSet)我已經很久沒用了,不過還是有些舊案子還在維護多少會用到,今天在寫程式時發現有個非常詭異的現象,研究出來後才發現這可能會引發一些潛在的資安問題,因此寫起來提醒各位。

我有個強型別資料集 (Typed DataSet) 的 Typed DataTable,該表格的 Primary Key 欄位長度為 10,在資料庫中定義的欄位是 Varchar2(10)   [ 備註: 我這次用的是 Oracle 資料庫,但此陷阱應該跟 DB 無關 ]

Properties: 我有個強型別資料集 (Typed DataSet) 的 Typed DataTable,該表格的 Primary Key 欄位長度為 10,在資料庫中定義的欄位是 Varchar2(10)

當我利用 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

Parameters Collection Editor

最後我才發現,只要傳入的資料超過參數設定的 Size 上限就會自動被截斷,然後才傳入資料庫查詢,雖然資料庫收到的只有前 10 個字元,但在你原本的 .NET 程式若也有用到這個傳入參數時,你可能不會料想到會有這種行為,也很可能會發生未預期的錯誤發生。

例如你若透過強型別資料集提供的方法進行驗證登入是否成功,驗證過後就以登入的帳號對資料庫進行操作,雖然驗證通過,但帳號卻是錯誤的,這時就不知道會發生什麼事了。

雖然不是什麼嚴重的問題,但你也可能跟我一樣覺得很困惑(confuse),所以在寫程式時可能要特別注意。