2011年12月9日 星期五

每一個 request 都要檢查後, 再放進去 database 裡做操作

建議程式裡的每一個 request 都要檢查後, 再放進去 database 裡做操作,

舉例, case 是畫面上有很多筆資料, 要整批做更新,
假設有一段 SQL command 要執行, 有人是直接醬子寫.

一般正常的操作流程下, 程式不會出問題, 但如果有人亂輸入內容, 程式就會發生 500 Error, 例如 user 輸入 &dir, 由於 Num 欄位和 Seq 欄位都是 int 型別, 所以輸竹了文字的資料, 就會發生錯誤:
將_nvarchar_值_'&dir'_轉換成資料類型_int_時,轉換失敗。


針對這個 case 要降低 500 Error 發生的機率, 請先把 request 到的資料, 放到變數裡, 先經過簡單的前置檢查後, 再把變數的內容放到 sql command 裡來執行, 建議的寫法如下:



我猜 input FORM 裡會輸入的資料, 大致上分成: 數字 和 文字2種,
數字的話, 使用 isNumeric() 應該就可以解決掉大部份的變數內容檢查,
文字的話, 建議先從 database 裡的 column 來限制收到的變數的長度, 最好可以再針對欄位內容做過濾, 像是不允許內容出現 SQL 指令, 和部份 stored procedure 指令.

沒有留言:

張貼留言

Facebook 留言板