从学生信息系统开始,就接触关于SQL注入的话题,对于什么是SQL注入,如何避免SQL注入一直都是似懂非懂,最近看视频牛腩老师关于SQL注入这部分做出了一个详细的讲解,对于我自己的理解仅发表博客,简单的介绍一下。
一、什么是SQL注入
对于概念,网上都有详细的介绍,在最基础的层面上我理解的SQL注入通俗的说就是利用一些非法查询攻击系统,获得一些关于数据库中的信息,达到某种目的,然后对于什么是非法的查询,为什么通过这种查询就可以获得数据库中信息,以及应该怎样详细的避免,下面详细讲解:
我介绍一种通过构建动态的sql语句解释一下SQL注入
以新闻发布系统中的讲解为实例:
如果在界面添加一条新闻类别:
通过在文本框中输入:
娱乐新闻’)delete category where id=3- -
出现的结果就是:
这样虽然添加了“娱乐新闻”,但是却删除了第三条记录.
我们把这条语句放到数据库中的查询分析器中进行运行:
这就造成了人为的更改了传入数据库中的SQL语句,数据库中通过拼接的字符串就改变了原来的意思。这就是人们利用动态传入SQL语句对数据库进行操作。
二.通过传参的形式避免SQL注入
我们在编写后台数据处理层的代码的时候通过传入参数的方式避免这种通过动态传入SQL语句引起的SQL注入。
string sql = "insert into category(name) values(@caName)";
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@caName",caName )};
此时在SQLHelper中的方法同样也是带参数的非查询语句:
public int ExecuteNonQuery(string cmdText,SqlParameter[] paras,CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange (paras);
res = cmd.ExecuteNonQuery();
}
return res ;
}
运行的结果如图:
原理就是,在界面上输入的语句,在数据库中就全部作为了一个参数进行传递,在之前敲的机房收费系统,全部采用的都是带参数的SQL语句,当时并不懂这样就能在一定程度上避免SQL注入,看完牛老师的视频突然间明白了,
对于引起SQL注入的还有好多方式,避免SQL注入的同样也有很多方法,这种使用参数化的过滤语句是最常用的,利用对数据库中字段进行限制,用错误消息处理,加密处理以及调用存储过程的方法,大家自己去尝试一下。