当前位置:编程学习 > C#/ASP.NET >>

请教一个防SQL注入的方法可行不可行。

用了参数化和存储过程还是有注入现象。
想到一个办法。大家看可行不可行?
用2个SQL用户分别给不同的权限。
打个比方:
A用户只能select,用在前台(也就是普通用户能看到的页面)。
而B用户能select,update,INSERT和Delete,用在后台管理页面(后台管理页面是要验证用户的)。这样可行不? --------------------编程问答-------------------- 用了参数化和存储过程还是有注入现象。
在数据库系统本身没有bug的前提下(事实上你也几乎遇不到,可以视作没有),应该不会出现这样的情况。 --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
用了参数化和存储过程还是有注入现象。
在数据库系统本身没有bug的前提下(事实上你也几乎遇不到,可以视作没有),应该不会出现这样的情况。

但是实际情况就是发生了,所以我想请教下我上述的方法可行不? --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
用了参数化和存储过程还是有注入现象。
在数据库系统本身没有bug的前提下(事实上你也几乎遇不到,可以视作没有),应该不会出现这样的情况。

但是实际情况就是发生了,所以我想请教下我上述的方法可行不?我的思路就是,你黑客不是要攻击吗,我就直接不给普通用户update,INSERT和Delete的权限。 --------------------编程问答-------------------- 注入的根源就是拼串,避免拼串采用参数传递,使其传递数据只当纯数据。楼上方法并不能避免注入,如果采用组串还是可以注入。不知道你说的注入是频繁添加程序,还是指的是程序bug. --------------------编程问答--------------------
引用 3 楼 bibaiscsn 的回复:
引用 1 楼 caozhy 的回复:用了参数化和存储过程还是有注入现象。
在数据库系统本身没有bug的前提下(事实上你也几乎遇不到,可以视作没有),应该不会出现这样的情况。
但是实际情况就是发生了,所以我想请教下我上述的方法可行不?我的思路就是,你黑客不是要攻击吗,我就直接不给普通用户update,INSERT和Delete的权限。


你要找到问题的原因,重现这样的bug,比如说什么查询,什么用户输入下发生了攻击,如果你没有办法知道这一点,添加完备的日志先观察下。防止sql注入不能解决所有问题,还可能的攻击方式包括跨站攻击、脚本、上传漏洞、伪造用户身份等等。 --------------------编程问答--------------------
引用 楼主 bibaiscsn 的回复:
用了参数化和存储过程还是有注入现象。
想到一个办法。大家看可行不可行?
用2个SQL用户分别给不同的权限。
打个比方:
A用户只能select,用在前台(也就是普通用户能看到的页面)。
而B用户能select,update,INSERT和Delete,用在后台管理页面(后台管理页面是要验证用户的)。这样可行不?

一点也看不出来,不知道你是怎么“认为可行”的,不知道你的道理在哪里。

防止注入,前提是自己会注入。否则你怎么防止?没有针对性而瞎猜各种可能性? --------------------编程问答--------------------
引用 3 楼 bibaiscsn 的回复:
但是实际情况就是发生了,所以我想请教下我上述的方法可行不?我的思路就是,你黑客不是要攻击吗,我就直接不给普通用户update,INSERT和Delete的权限。
你写过多少使用sql的程序?你的程序(普通用户)所运行的程序也没有修改数据库的代码吗?有吧!

另外,只读数据库,就不是人家想看的么?如果让任何人随便看银行里所有其它客户的账户等等信息,这算不算泄密?这算不算被人入侵了系统呢?

另外注入之后,例如我们可以去格式化硬盘,或者去获取服务器的登录账号和密码(或者偷偷设置一个),总之有一点功能就行了。谁说黑客都跟那些男脑子只有数据库表“增删改查”的人一个编程档次? --------------------编程问答--------------------
引用 2 楼 bibaiscsn 的回复:
但是实际情况就是发生了,

贴出你的存储过程来。

特别是假设里边有exec执行字符串宏命令,那么这种存储过程尽量删除掉。 --------------------编程问答-------------------- 4楼所说的是sql注入的一个重要原因,为随便写个例子供楼主参考:
DECLARE @_Sql NVARCHAR(4000);SET @_Sql='';
DECLARE @_Name NVARCHAR(100);SET @_Name='甲醇'';SELECT ''看到我,表示注入成功''--';

--使用EXEC SP_EXECUTESQL,动态sql方式,无法注入
SET @_Sql='SELECT TOP 1 * FROM Product
    WHERE ProductName1 LIKE ''%''+@Name+''%'';';
--此处用局部变量@_Name 替换了sql参数@Name,可以重复利用sql而不用担心参数命名的冲突
--由于每次提交了相同的sql,只是参数不同,可以自动获得执行计划的性能优势
EXEC SP_EXECUTESQL @_Sql,N'@Name NVARCHAR(100)',@_Name;

--拼接方式,可以注入
SET @_Sql='SELECT TOP 1 * FROM Product
    WHERE ProductName1 LIKE ''%'+@_Name+'%'';';
--这里,由于每次提交的sql都不一样,无法利用sql执行计划的优势
EXEC SP_EXECUTESQL @_Sql;
--------------------编程问答-------------------- 我之前网站也遇到SQL注入 后来采取的方式是 转化字符 --------------------编程问答--------------------
Quote: 引用 9 楼 microtry 的回复:

DECLARE @_Sql NVARCHAR(4000);SET @_Sql=''; DECLARE @_Name NVARCHAR(100);SET @_Name='甲醇'';SELECT ''看到我,表示注入成功''--';   --使用EXEC SP_EXECUTESQL,动态sql方式,无法注入 SET @_Sql='SELECT TOP 1 * FROM Product     WHERE ProductName1 LIKE ''%''+@Name+''%'';'; --此处用局部变量@_Name 替换了sql参数@Name,可以重复利用sql而不用担心参数命名的冲突 --由于每次提交了相同的sql,只是参数不同,可以自动获得执行计划的性能优势 EXEC SP_EXECUTESQL @_Sql,N'@Name NVARCHAR(100)',@_Name;   quote]
这样改并不能完全避免注入,如果@_Name 传入 
%' or 1=1  or ProductName1  like '% 
仍然可以注入
like换成charindex,改为:
SET @_Sql='SELECT TOP 1 * FROM Product  WHERE charindex(@Name,ProductName1)>0  --------------------编程问答-------------------- 同意8L。

在存储过程中直接拼凑sql那你还“参数化”什么呢,其实有标准的做法,用QUOTENAME()去包装作为标识符的名称即可。 --------------------编程问答--------------------
引用 11 楼 lienzhu 的回复:

不能注入,你在参数中的任何内容都是参数,不会被解释成cmd的一部分,
这也是动态(参数化)sql和拼接sql最大的区别,
也是为什么这个语句可以放入执行计划的原因(而不是每次都要编译) --------------------编程问答--------------------
引用 12 楼 caozhy 的回复:
同意8L。

在存储过程中直接拼凑sql那你还“参数化”什么呢,其实有标准的做法,用QUOTENAME()去包装作为标识符的名称即可。

仔细检查了下,发现是有些地方传入的参数没有严格限制类型(当初偷懒没有注意到),这个会不会事原因呢? --------------------编程问答-------------------- http://technet.microsoft.com/zh-cn/library/ms161953(SQL.105).aspx
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,