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

如何防止SQL注入英文篇(不允许过滤危险字符)

首先不允许过滤URL中的delete、单引号,exec、;等有恶意的字符串。因为用于英文的搜索这些是必须的,无法区分是用户搜索或试探注入
key=......这里传入的是字符串,也不能根据是否int等类型判断。。。
使用存储过程是必须的,但好像存储过程也不能完全避免被注入?
如何解决? --------------------编程问答-------------------- 我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢?? --------------------编程问答-------------------- SqlParameter参数,加过滤 特殊标签。 --------------------编程问答-------------------- sf?
这样都不给了,好过分啊 --------------------编程问答-------------------- 你见过二进制注入没有?没有单引号照样注入的
引用 1 楼 shinnakoruru 的回复:
我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢??
--------------------编程问答--------------------
引用 4 楼 literss 的回复:
你见过二进制注入没有?没有单引号照样注入的
引用 1 楼 shinnakoruru 的回复:
我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢??


我正想见见呢

麻烦您给个例子,什么情况下会出现2进制注入漏洞 --------------------编程问答--------------------
引用 4 楼 literss 的回复:
你见过二进制注入没有?没有单引号照样注入的
引用 1 楼 shinnakoruru 的回复:
我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢??



发个来看看,什么二进制的注入方法,太牛B了 --------------------编程问答-------------------- 二进制代码的Sql 注入攻击
http://blog.csdn.net/tkjune/archive/2009/01/03/3687728.aspx --------------------编程问答--------------------
引用 4 楼 literss 的回复:
你见过二进制注入没有?没有单引号照样注入的
引用 1 楼 shinnakoruru 的回复:
我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢??


我正想见见呢

麻烦您给个例子,什么情况下会出现2进制注入漏洞 --------------------编程问答-------------------- 看了,果然很牛B。。。 --------------------编程问答-------------------- 呵呵,厉害!


回复内容太短了!  --------------------编程问答--------------------
引用 10 楼 fwacky 的回复:
呵呵,厉害!


回复内容太短了!

这个限制功能是这两人天刚有的吧,可能是防止发帐号转积分吧
SQL注入不了解,要是测试应该注意什么呢?
呵呵 问问题的同时也顶一下本贴 --------------------编程问答--------------------
引用 7 楼 wosizy 的回复:
二进制代码的Sql 注入攻击
http://blog.csdn.net/tkjune/archive/2009/01/03/3687728.aspx

太牛了.呵呵 --------------------编程问答-------------------- 发过帖子之后出去办事了,刚回到电脑前

看了文章,我怎么没看明白怎么实现的不带单引号攻击?
哪位给解释一下?
不带单引号能执行CAST? --------------------编程问答-------------------- 参数化
http://topic.csdn.net/u/20090708/09/b78444ee-9081-4ff7-8aa5-ba6f9b1d9fdc.html --------------------编程问答--------------------
引用 5 楼 shinnakoruru 的回复:
引用 4 楼 literss 的回复:你见过二进制注入没有?没有单引号照样注入的引用 1 楼 shinnakoruru 的回复: 我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢??

我正想见见呢

麻烦您给个例子,什么情况下会出现2进制注入漏洞


我也想见见! --------------------编程问答-------------------- 二进制注入其实也只是换汤不换药,它把一个SQL先转编为十六进制编码,这样可以绕开你对一些特殊符号的过滤,然后在注入时用CAST函数将其还原,并用exec或execute执行它。所以二进制注入也是需要条件的,需要cast,exec之类的函数没有被过滤掉。

但是不管怎么说,拼接字符串都会有被注入的风险,所以建议用参数化查询语句(使用SqlParameter )或者使用存储过程,这样可以一劳永逸 --------------------编程问答-------------------- 頂一下,學習一下,Marx --------------------编程问答-------------------- 我也从来没见过,发来看看
千万别说,你也没见过

引用 4 楼 literss 的回复:
你见过二进制注入没有?没有单引号照样注入的
引用 1 楼 shinnakoruru 的回复:我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢??
--------------------编程问答-------------------- Friendly Up! --------------------编程问答-------------------- 1楼说的很对,最简单的,如果是数值,在C#里就判断好,不是数值,不进行sql拼接
如果是字符串,拼接sql前后肯定会加单引号,此时只要替换字符串里的单引号为2个单引号就可以了

楼主和16楼所谓的二进制注入,怎么可能实现?
十六进制编码明显不是数值,放在字符串里也被单引号括起来了,有个p用


引用 16 楼 0009 的回复:
二进制注入其实也只是换汤不换药,它把一个SQL先转编为十六进制编码,这样可以绕开你对一些特殊符号的过滤,然后在注入时用CAST函数将其还原,并用exec或execute执行它。所以二进制注入也是需要条件的,需要cast,exec之类的函数没有被过滤掉。

但是不管怎么说,拼接字符串都会有被注入的风险,所以建议用参数化查询语句(使用SqlParameter )或者使用存储过程,这样可以一劳永逸
--------------------编程问答-------------------- 使用存储过程,如果在存储过程里也进行拼接
怎么可能一劳永逸?问题和C#里是一样的
也要判断数值类型,替换单引号。

而拼接sql在某些情况下是必须的

除非你每个参数都这么写:
and (name = :vName or :vName is null)

这样,sql又不使用索引,效率低了(针对Oracle) --------------------编程问答--------------------
引用 20 楼 youbl 的回复:
 楼主和16楼所谓的二进制注入,怎么可能实现?
 十六进制编码明显不是数值,放在字符串里也被单引号括起来了,有个p用


你该回去面壁看书了,十六进制需要单引号? 0x12345..... 就OK了,但是我也说了,所谓这种的16进制方式,只不过是可以避开一些符号的限制,如等号,单引号,空格等,也非万能的注入方法。
--------------------编程问答-------------------- 良好的代码风格是最重要的,强烈建议使用SqlParameter,这样即使你使用了SP,并在SP中拼接了字符串,用SqlParameter也可以有效地防止被SQL注入。 --------------------编程问答-------------------- 呵呵,举个例子:
insert into tb values('0x12345')
难道这样存入数据库的会不是0x12345,会变成其它字符?


引用 22 楼 0009 的回复:
引用 20 楼 youbl 的回复:楼主和16楼所谓的二进制注入,怎么可能实现? 十六进制编码明显不是数值,放在字符串里也被单引号括起来了,有个p用

你该回去面壁看书了,十六进制需要单引号? 0x12345..... 就OK了,但是我也说了,所谓这种的16进制方式,只不过是可以避开一些符号的限制,如等号,单引号,空格等,也非万能的注入方法。
--------------------编程问答--------------------
引用 7 楼 wosizy 的回复:
二进制代码的Sql 注入攻击
http://blog.csdn.net/tkjune/archive/2009/01/03/3687728.aspx


这个是16进制。 --------------------编程问答-------------------- 不知道你有没有在存储过程里拼接过sql?
没有拼接过,就不要误导别人,
如果存储过程里有下面的代码:
v_Sql := 'select username from user where id = ''' || vId || '''';

那么一样会有注入问题。


引用 23 楼 0009 的回复:
良好的代码风格是最重要的,强烈建议使用SqlParameter,这样即使你使用了SP,并在SP中拼接了字符串,用SqlParameter也可以有效地防止被SQL注入。
--------------------编程问答-------------------- 而且楼上各位说的所谓二进制注入(16进制也好)
举的例子都是id=xxx
没有判断是否数值就去拼接sql,不出问题才怪

而如果id是字符型,你的sql这么写:id=xxx,一样会报错

所以我再一次支持1楼的说法。 --------------------编程问答-------------------- 用linq不行么? --------------------编程问答--------------------
引用 24 楼 youbl 的回复:
呵呵,举个例子:
 insert into tb values('0x12345')
 难道这样存入数据库的会不是0x12345,会变成其它字符?


汗,完全是不知所云了。。。。

你能了解一下什么是SQL注入好吧,N年前就玩烂了的入侵技术了。 --------------------编程问答-------------------- 呵呵,你觉得不了解?
那你就当我不了解吧

那你请指出我说的话的漏洞所在就好
让我也学习一下,我坚持了那么多年的理论是存在问题的。


引用 29 楼 0009 的回复:
引用 24 楼 youbl 的回复:呵呵,举个例子: insert into tb values('0x12345') 难道这样存入数据库的会不是0x12345,会变成其它字符?

汗,完全是不知所云了。。。。

你能了解一下什么是SQL注入好吧,N年前就玩烂了的入侵技术了。
--------------------编程问答-------------------- 汗。。。。
到底什么是SQL注入呀。。。。 --------------------编程问答--------------------
引用 30 楼 youbl 的回复:
呵呵,你觉得不了解?
 那你就当我不了解吧

 那你请指出我说的话的漏洞所在就好
 让我也学习一下,我坚持了那么多年的理论是存在问题的。


引用 29 楼 0009 的回复:
引用 24 楼 youbl 的回复:呵呵,举个例子: insert into tb values('0x12345') 难道这样存入数据库的会不是0x12345,会变成其它字符?

汗,完全是不知所云了。。。。

你能了解一下什么是SQL注入好吧,N年前就玩烂了的入侵技术了。


你觉得表示一个十六进制数需要单引号吗?

下面的代码是一个简单的例子,注入的时候可以灵活地变化成你需要的语句:
declare @s varchar(255)
set @s=cast(0x73656c6563742031 as varchar(255))
exec(@s)
--------------------编程问答-------------------- 不过我前面也说错了,这种方法其实还是需要空格,不过空格也很容易被绕过,比如\t\f\r\n或者/**/这些都可以轻易地取代空格的限制。 --------------------编程问答-------------------- 单纯地过滤单引号是很弱的,比如我union select admin表的数据,根本就用不到单引号。 --------------------编程问答-------------------- 你说的我也理解,无非就是把正常的字符写成16进制的编码
但是这个前提要建立在代码中,没有把字符放在单引号里
才能注入成功

你的回答,是把楼主的问题复杂化了
举个例子,如果我的代码是这样的:
string a = Request.Form["uName"];
string sql = "select * from users where username = '" + a.Replace("'","''") + "'";
那么你提交的内容无论是什么,都无法攻击

如果是用数值型的id:
string a = Request.Form["uName"];
int b;
if(!int.TryParse(a, out b)){
  Resposne.Write("非法数字");
  return;
}
string sql = "select * from users where id = " + a;
这样一样无法攻击

所以说,1楼是用最简单的方法避免被攻击。


引用 32 楼 0009 的回复:
引用 30 楼 youbl 的回复:呵呵,你觉得不了解? 那你就当我不了解吧 那你请指出我说的话的漏洞所在就好 让我也学习一下,我坚持了那么多年的理论是存在问题的。 引用 29 楼 0009 的回复: 引用 24 楼 youbl 的回复:呵呵,举个例子: insert into tb values('0x12345') 难道这样存入数据库的会不是0x12345,会变成其它字符? 汗,完全是不知所云了。。。。 你能了解一下什么是SQL注入好吧,N年前就玩烂了的入侵技术了。

你觉得表示一个十六进制数需要单引号吗?

下面的代码是一个简单的例子,注入的时候可以灵活地变化成你需要的语句:
SQL codedeclare@svarchar(255)set@s=cast(0x73656c6563742031asvarchar(255))exec(@s)
--------------------编程问答-------------------- 作点小修正:
如果是用数值型的id: 
string a = Request.Form["id"]; 
int b; 
if(!int.TryParse(a, out b)){ 
  Resposne.Write("非法数字"); 
  return; 

string sql = "select * from users where id = " + b; 
这样一样无法攻击 

所以说,1楼是用最简单的方法避免被攻击。 
--------------------编程问答-------------------- 嗯,我明白我跟你分歧了,我指的是通用的参数过滤(不分类型),而你是专指字符型。
确实在字符型过滤单引号就可以阻止注入,因为原有的引号需要被闭合。
但是在数值型上,如果也简单地这样处理必然会出问题,当然强制类型转换是一个很好的解决方案。

但是需要指出的是,使用SqlParameter仍然是一个值得推荐的写法,它能使代码的可读性大大提高,同时也在很大的范围内限制了被SQL注入的风险(你前面提到的那种在SP中拼接的情况确实SqlParameter也无能为力)。 --------------------编程问答-------------------- 有必要说一下……除了我说的简单方式之外,我个人是把所有查询都写成存储过程,哪怕就一个select * from TABLE
另外我从不用存储过程拼接串,另外我一直是用SqlParameter
请注入。 --------------------编程问答-------------------- 从来不用拼接,那么对于报表查询,你如何处理?
比如报表需要10个条件,你的存储过程就要写10个参数
如果有20个条件,你的存储过程就写20个参数?
或者在一个参数里进行逗号分割之类的?


引用 38 楼 shinnakoruru 的回复:
有必要说一下……除了我说的简单方式之外,我个人是把所有查询都写成存储过程,哪怕就一个select * from TABLE
另外我从不用存储过程拼接串,另外我一直是用SqlParameter
请注入。
--------------------编程问答-------------------- 而且不拼接,如何写你的sql?
你的sql如何初始化?

如果只是1,2个参数
那你的还可以直接写
select * from tb1 where id = :vId and name = :vName

那如果是20个参数
你的sql就是:
select * from tb1 where id = :vId and name = :vName and………………

呵呵 --------------------编程问答-------------------- 算了,扯了半天,没劲,继续搞我的博客去。 --------------------编程问答--------------------
引用 7 楼 wosizy 的回复:
二进制代码的Sql 注入攻击
http://blog.csdn.net/tkjune/archive/2009/01/03/3687728.aspx


我看了,也是拼接式的注入攻击.

用参数传递,强类型。能够防止SQL注入。 --------------------编程问答-------------------- 看了大家的讨论,终于明白了什么是SQL注入。。。。。
个人觉得没什么大问题。
1。对参数约定好格式和长度
2。做好必要的验证
3。不要直接用参数拼接SQL语句(转换一把)
应该就没有大问题了吧 --------------------编程问答-------------------- 看看,顺便学习~~~~~~~~~~ --------------------编程问答-------------------- up回复内容太短了! --------------------编程问答-------------------- 从来没有人叫你过滤,叫你过滤的人都是傻× --------------------编程问答-------------------- 替换'为'',同时应该把sql里面的保留字符加上[],比如把%替换为[%]

--
至于单引号问题完全可以用参数话代替。 --------------------编程问答-------------------- ms我一直用参数化查询的,
select * from a where b=@b
你们就来注入吧。 --------------------编程问答-------------------- 拼接传过来的参数也是没问题的,比如这样: 
string a = Request.QueryString["id"]; 
string sql = "select * from tb where id = '"+ a.Replace("'","''") +"'"; 

你们就来注入吧。 --------------------编程问答-------------------- 受教了...长见识了.. --------------------编程问答-------------------- 呵呵,看完全贴。


"你们就来注入吧" --------------------编程问答-------------------- --------------------编程问答--------------------
引用 49 楼 youbl 的回复:
拼接传过来的参数也是没问题的,比如这样:
string a = Request.QueryString["id"];
string sql = "select * from tb where id = '"+ a.Replace("'","''") +"'";

你们就来注入吧。

别以为替换这个了就100%就防注入了,你说话也太小看一些高人了。。。 --------------------编程问答-------------------- 呵呵,
正在等高人……

高人快来攻击啊

引用 53 楼 jxyxhz 的回复:
引用 49 楼 youbl 的回复:拼接传过来的参数也是没问题的,比如这样: string a = Request.QueryString["id"]; string sql = "select * from tb where id = '"+ a.Replace("'","''") +"'"; 你们就来注入吧。
别以为替换这个了就100%就防注入了,你说话也太小看一些高人了。。。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,