比如,我要知道你的sql数据库用户名
http://www.100.com/news.aspx?id=49 and user>0
程序会报错:将nvarchar值 ”sa” 转换数据类型为 int 的列时发生语法错误
ok,攻击者知道你的数据库用户名了(sa)
user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错
SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,你这台主机我都能控制了
再比如我想知道你的管理员表的名字:
http://www.100.com/news.aspx?id=49 and (Select count(*) from admin)>0
如果页面不出错,那么我就知道你的管理员表是admin这个表了
大概知道怎么防范sql注入了吧
1.sql语句尽量写成参数形式 select * from news where id=@id
2.如果用字符串连接的方式写sql语句,那么最好对输入参数做必要的验证
string sql="select * from news where id="
sql+= int.Parse(Request.QueryString("id").toString()).toString();
一般我们在写in条件查询的时候
写法如下:
select * from contactcomp where companyid in(80522010000128585,80312010000093905)
in的条件是由界面传进来的,那么这样就存在着sql注入了,注入方法如下:
select * from contactcomp where companyid in(80522010000128585,80312010000093905);select * from userinfo;--)
这只是一个例子,大家可以发挥。利用这个漏洞,我们可以做很多操作。
所以凡是有where条件的,都要我们组织sql语句,要过滤用户输入的条件。比如上面我们就可以以long[]作为参数代替字符串,然后自己将long[]连接成字符串再进行查询。
LIke的条件查询也是一样的做法。
Select * from contactcomp where name like '%' and 1=1 and '%'='%'
Select * from contactcomp where name like '%name%'