在做VB版机房收费系统的时候就了解到了SQL注入,那个时候再网上查了一些资料,感觉很高大上也没有弄得很懂,这次再看到SQL注入,弄清楚了它的来龙去脉。
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。——百度百科
看到这么一堆的解释还是没有很懂,下面来看一个例子。
在我们设计的web窗体中有一个Text文本框用来输入字符串,添加类别。当然这个记录要添加到数据库中,当让要使用SQL语句。
如果我们的sql语句这这样写的
D层SQL语句
String sql ="insert into category(name) values('" + caName + "')"
//这里的" + caName + "就是参数
省略B层
U层
String category=txtCa.text.trim();
//将输入到文本框中的字符串当做参数,通过B层传到D层。
一般的如果我们在U层中的text输入的是“体育新闻”,那么在D层的sql语句是:insert into category(name) values(' 体育新闻 ')" 这样没有问题可以将类别添加到数据库的表中。
但是如果有人在文本框中输入的是这样的非正常字符串:社会新闻 ' )Delete category where ID=3--
把这一长串的字符当做参数传到到D层之后SQL语句就会变成这样:
insert intocategory(name) values(' 社会新闻 ' )Delete category where ID=3--')
要注意“--”在sql语句中是注释作用,所以到最后执行的语句就是添加“社会新闻”的同时,将ID为3 的新闻类别删除。
这样就会对我们的数据库的数据有所破坏。
解决:
为避免SQL注入,我们在写SQL语句的时候就要避免使用字符串的拼接,要使用参数来进行。如上面例子中的参数" + caName + "可以使用
new SqlParameter(“@caName”, category);
这样sql语句可以写成:
String sql= Stringsql = "insert into category(name) values(@caName);
这样如果还是输入了非正常字符串,拼接之后就是得到sql语句:
insert into category(name) values(社会新闻 ' )Deletecategory where ID=3--)
虽然就缺少了一个’ ,数据就没有办法识别该语句会报错,这样避免数据库的数据库遭到破坏。