技术资料 >> ASP.Net资料库 |
 |
|
搜索标签:
SqlParameter
|
SqlParameter用途-防止SQL注入攻击,提高安全性[转载] |
[阅读次数:2223次] [发布时间:2009年9月28日] |
”不求甚解”一词,有时是在责备读书人做学问不够彻底、一知半解、不求上进等等,对自尊心强或自负的人算是很没面子,虽然我自认很努力学习.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的新六种参数型态在安全性方面大大加分,与安全性至上前提相较之下,参数的程式码多写几行根本是微不足道的。
看过这篇后,至少我及没注意到的人不会再不求甚解了^^
本页地址:
[复制地址]
该页内容非本站原创 收藏自:http://www.tzwhx.com/newOperate/Html/3/31/311/18423.html
|
返回顶部  |
|
|
|
|
推荐链接 |
|
最近更新 |
|
|
|
热门浏览 |
|
|
|
|