前言
什么是SQL注入?
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
个人理解:
就是系统用户通过一些手段(Web表单输入),将含有自己意愿的SQL语句注入到系统设计的SQL语句中,违反设计者的要求,从而实现自己的目的。
实例:
我们平时接触的数据库链接,都是通过SQL语句来完成的,但是有的时候是不是用到了SQL语句的动态链接呢?
如下图:
select * from tablename where id = '+ id的字符串+'
这就是我们所谓的字符串的拼接,我们一般通过textbox获取用户输入的数据。
但是用户输入的是:
id的字符串 +' delete tablename where id = 1 -- //在SQL中--为注释符号
这样的结果就是:
select * from tablename where id = '+ id的字符串+'
delete tablename where id = 1
-- +'
运行结果为:
- 查询用户所需内容
- 删除表格id为1的新闻
你会发现这样的话, 程序不仅运行了系统默认的程序,还运行了你写的程序,从而使系统邮局很大的安全风险,这就是最简单的SQL注入了。
解决
那么怎么解决这种的问题呢?
参数化SQL
其实大家应该早就了解了,那就是在SQL语句中,通过参数传递变量,而不是简单的字符串拼接。
用C#举例
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter ("@id",Id ),
};
string sql = "select * from tablename where id =@id";
这样的话,系统会把用户传来的Id默认为一个整体的变量,会自动对Id的数据类型进行转换,问题也就解决了!
反思
自问一:
我是怎么了解到SQL注入的呢?
答:没错,是在看视频的时候,里边的老师讲到了!
自问二:
其实我在之前机房重构的时候,就已经接触到了动态链接SQL语句和参数化SQL,而且我用的也是参数化,是因为我早就了解了SQL注入吗?
答:不是,是因为大家都这么做,我也就跟着这样了,而没有深入思考为什么,都能实现相同的功能,为什么用它不用它呢?
虽然现在看来,结果是一样的,我都了解到了,但是如果自己思考发现的问题肯定与别人给你说的要深刻的多!
其实有很多新的事物不是不存在,而是大家没有去发现它!
正如那句话:“生活中不是缺少美,而是缺少发现美的眼睛!
后语
透过现象看本质,透过问题反思自己!