在vb版机房收费系统的时候就听说过SQL注入的问题,机房重构的时候D层的代码就使用参数化查询的方法来防止SQL注入,现在学习牛腩,老师特别详细的给我们展示了SQL注入的一个过程,并且也是通过参数化查询的方法来解决这个问题。
首先说一下什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。入侵者只要知道数据表中的任意一个用户名,就可以登录统,随意更改数据表的资料,这样就会造成无法弥补的损失,比如之前我们听说的某网站用户密码被公布的事情,就是通过这样的方式暴出的。
然后看一下如何使用参数化查询防止SQL注入,我们以牛腩中的讲解为例,在牛腩中没有进行参数化查询之前的代码为:
SQLHelper中:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">public int test() { int res; using (cmd=new SqlCommand("insert into category(name) values(@caName)"),GetConn()) { cmd.Parameters.Add(new SqlParameter("@caName","牛腩测试")); res=cmd.executeNonQuery(); } return res; }</span></span>categoryDAO类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public bool Insert(string caName) { bool flag=false; string sql="insert into category(name) values("+caName +")"; int res =sqlhelper.ExecuteNonQuery(sql); if (res>0) { flag=true; } return flag; } </span>这样的话,老师在界面上用一条SQL语句的字符串在数据库中增加了一条记录的同时还删去了一条记录。所以老师重新编辑sqlhelper和categoryDAO类,修改后的代码如下:
sqlhelper:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> public int ExecuteNonQuery(string cmdText,SqlParameter [] paras,CommandType ct) { int res; using (cmd=new SqlCommand(cmdText,GetConn ())) { cmd=new SqlCommand (cmdText,GetConn ()); cmd.CommandType =ct; res=cmd.ExecuteNonQuery (); } return res ; }</span>categoryDAO类:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> public Boolean Insert(string caName) { bool flag = false; string sql = "insert into category(name) values(@caName)"; SqlParameter[] paras = new SqlParameter[] { new SqlParameter ("@caName",caName ) }; int res=sqlhelper .ExecuteNonQuery (sql); if (res>0) { flag =true ; } return flag; }</span>这样,即使老师同样输入:牛腩测试')delete category where id=4--,它只是增加和文本框相同的内容,而不会删除内容了。老师在SQLHelper里面使用参数paras,在categoryDAO中使用@caName这样的参数,再为@caName这个参数赋值,这样就防止了SQL注入,在机房中也是利用这中参数化查询的方式来防止这种漏洞的。
通过以上的代码我们可以知道参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来赋值, SQL Server 的参数格式是以 "@" 字符加上参数名称而成的。
总结:
这是我对参数化查询防止SQL注入的一点理解,但是为什么参数化查询可以防止SQL注入,推荐大家阅读:请点击此处。里面详细介绍了为什么可以防止。防止SQL注入的措施还有很多,大家可以网上搜索一下,还是比较容易理解的,只是我们还没有运用。相信随着我们的学习预防的方法还会接触的。