首頁 »
2006/01/04

對SqlParameter的不求甚解

你是否曾對SqlParameter不求甚解?我竟然也是...

節錄自【聖殿祭司的ASP.NET 2.0】新書

”不求甚解”一詞,有時是在責備讀書人做學問不夠徹底、一知半解、不求上進等等,對自尊心強或自負的人算是很沒面子,雖然我自認很努力學習.NET相關技術,至少在我自己常用的程式部分應讓瞭若指掌,但我最近發現我在Parameter這個東西上是”不求甚解”,以下是分析: 如果你要新增資料到資料庫,典型的ADO.NET寫法如下:

strSQL1+="TestDate,TestTime,RealDate,ModelTop,ModelDown,Machine) values"; strSQL1+="(@txtTestDate,@txtTestTime,@txtRealDate,@txtModelTop,@txtModelDown,@txtMachine)" SqlConnection conn=new SqlConnection(ConfigurationSettings.AppSettings["SQLConnection"]); conn.Open(); SqlCommand cmd=new SqlCommand(); cmd.Connection=conn; cmd.CommandText=strSQL1; cmd.Parameters.Add("@txtTestDate",SqlDbType.NVarChar,10).Value=myRow["TestDate"]; cmd.Parameters.Add("@txtTestTime",SqlDbType.NVarChar,8).Value=myRow["TestTime"]; cmd.Parameters.Add("@txtRealDate",SqlDbType.NChar,10).Value=new PublicClass().GetDate(); cmd.Parameters.Add("@txtModelTop",SqlDbType.NVarChar,5).Value=myRow["ModelTop"]; cmd.Parameters.Add("@txtModelDown",SqlDbType.NVarChar,5).Value=myRow["ModelDown"]; cmd.Parameters.Add("@txtMachine",SqlDbType.NVarChar,20).Value=myRow["Machine"]; ... ... ...

或者你會用傳一段SQL語法用+加字號相連 以上有什麼問題呢? 1.我一直無法明確告訴那些直接帶SQL語法字串的人,不要用字串相加的方法,應該要用SqlParameter 2.我又無法明確告訴他們SqlParameter到底有什麼好處,且SqlParameter字串明顯又臭又長 3.微軟MCSD.NET只教大家用Parameter參數,好嘛!用參數才是純.NET人,我就用吧! 4.國內外的書籍也不曾有作者提過為什麼要用Parameter參數(可能是我看書不夠多) 5.我竟沒想過要去追根究底為何要使用Parameter參數 如此"混"過了好幾年,什麼時候才覺醒?在寫ASP.NET 2.0資料來源控制項時!為何會突然想到?因為被Shock了一下,請看我書中的節錄: ASP.NET 2.0對於資料控制項參數又增加多達六種參數,我第一次看到心裡只有一個感覺:「天哪,太過份了吧!」以前的Parameter帶參數雖然可以保持彈性,但是程式碼卻比SQL Statement又臭又長,現在微軟竟肆無忌憚地為擴充技術而擴充,把原本一種Parameter變成六個,請問程式設計師不累死才怪,哪裡學得完?以上是直覺想法沒錯,但在發怒前我先冷靜一下給微軟一個辯駁的機會,其實參數除了彈性之外,最重要的理由是「安全性!」所謂的安全性是為了防範SQL Injection的攻擊,而SQL Injection發生的原因有三點: (1)資料輸入沒有經過驗證,或很薄弱的驗證。 (2)以動態SQL Statement建構SQL命令,讓有心人可隨意傳入SQL命令破壞資料庫(這是非常多的程式設計師通病,請儘量不要使用可接受任意SQL命令方式來設計你的程式,只消一道Drop database命令就可能徹底毀滅掉資料庫)。 (3)使用過大權限的帳號來存取資料庫,而非適度的權限(如程式以sa來進行登入)。 以上三點平心而論你我大家都可能會犯,而且也是許多專案與程式設計師仍然廣泛使用的方式,如此在企業資訊安全當道的時代,若您沒有特別用心防護無異留給駭客一個看似微小卻比天還大的漏洞,一如教育部或聯考放榜十萬考生資料及成績可以被隨意竄改,資訊人員技術簡直是被看笑話,但就我個人觀點並不是安全技術不夠成熟,而是對安全性的投入太少、無知、沒有專家看管或根本無安全性可言,等發生重大機密外洩或資料遭竄改才驚覺安全性風暴已狂捲企業內部,下台的下台、處分的處分,其實可以不必這樣的,現在來看看使用Parameter參數能夠改善些什麼?Parameter參數除了動態提供傳值的作用外,最重要的是它會執行幾項工作:(1)檢查參數的型別(2)檢查參數的長度(3)保證Injected Code在資料庫中會被當成純文字而不是可以執行的SQL命令,因此參數進行了以上三項安全性檢查,將安全性強化到一定水準之上,以下是由Parameter衍生出六種新的參數型態:

 

從上面的SQL Injection安全性議題及參數又區分成六種更加明確的類型來看,使用新參數型態的確可以大幅增加安全性防護,比如說系統如果接受的是SessionParameter型態,當您餵的是CookieParameter或QueryStringParameter的型態勢必無法成功,或字串長度不合都會被系統擋掉,更別說駭客想用插入SQL命令的方式來攻擊你的資料庫了,故基於以上種種論述,ASP.NET 2.0的新六種參數型態在安全性方面大大加分,與安全性至上前提相較之下,參數的程式碼多寫幾行根本是微不足道的。

看過這篇後,至少我及沒注意到的人不會再不求甚解了^^

節錄自【聖殿祭司的ASP.NET 2.0】新書



Atlas的Timer計時器←上一篇 │首頁│ 下一篇→Atlas Framework快速上手體驗