34,594
社区成员
发帖
与我相关
我的任务
分享
create proc p
(@id int,
@name varchar(10))
as
begin
execute('select * from tb where id=' + @id + ' and name=''' + @name + ''')
end
go
在c#里,调用这个存储过程,给了两个参数,一个@id,一个@name
是的,@name,@id被定义了类型, @name里的字串被进行了转义, 乍一看没问题, 事实呢? 只是构造相对再复杂一点而已, 只要你脑子够清楚不被'和''搞晕, 一样的。
sqlparamepter pm = ....
pm[0].value=1;
pm[1].value="a'";
那么在execute里执行里面拼的语句已经是
select * from tb where id=1 and name=''a'''
你会说这条语句报错,因为定界符不匹配,
对的,你说对了, 为什么定界符不匹配,因为构造非法的字符串造成了定界符不匹配,既然已经干扰了定界符, 能过合理构造,你就能构造出你想要的语句。
这么说应该能说明吧, 不用我再构造清一次你的admins表吧。
这些是最直观的例子。
你会说,你通过避免拼动态语句来解决这个问题, 对的,可以解决。
但是会有更高阶的东西, 利用本身操作系统或者数据库服务器的一些漏洞(一般是较低层的,比如某某溢出),通过SQL注入,结合一些方法,完成攻破。 这个就不光是纯SQL的注入了,就不多介绍了。
9年前对这些东西感兴趣,弄过一些,包括国内知名的两个商业论坛, 后来淡了,这些东西没有再过多了解, 但是原理是不变的。
随手敲的,可能手误,见谅。