如何防止SQL注入英文篇(不允许过滤危险字符)
首先不允许过滤URL中的delete、单引号,exec、;等有恶意的字符串。因为用于英文的搜索这些是必须的,无法区分是用户搜索或试探注入key=......这里传入的是字符串,也不能根据是否int等类型判断。。。
使用存储过程是必须的,但好像存储过程也不能完全避免被注入?
如何解决? --------------------编程问答-------------------- 我怎么一直认为只要你做好类型转换的判断,把字符串参数中的'替换成''就OK了呢?? --------------------编程问答-------------------- SqlParameter参数,加过滤 特殊标签。 --------------------编程问答-------------------- sf?
这样都不给了,好过分啊 --------------------编程问答-------------------- 你见过二进制注入没有?没有单引号照样注入的
--------------------编程问答--------------------
我正想见见呢
麻烦您给个例子,什么情况下会出现2进制注入漏洞 --------------------编程问答--------------------
发个来看看,什么二进制的注入方法,太牛B了 --------------------编程问答-------------------- 二进制代码的Sql 注入攻击
http://blog.csdn.net/tkjune/archive/2009/01/03/3687728.aspx --------------------编程问答--------------------
我正想见见呢
麻烦您给个例子,什么情况下会出现2进制注入漏洞 --------------------编程问答-------------------- 看了,果然很牛B。。。 --------------------编程问答-------------------- 呵呵,厉害!
回复内容太短了! --------------------编程问答--------------------
这个限制功能是这两人天刚有的吧,可能是防止发帐号转积分吧
SQL注入不了解,要是测试应该注意什么呢?
呵呵 问问题的同时也顶一下本贴 --------------------编程问答--------------------
太牛了.呵呵 --------------------编程问答-------------------- 发过帖子之后出去办事了,刚回到电脑前
看了文章,我怎么没看明白怎么实现的不带单引号攻击?
哪位给解释一下?
不带单引号能执行CAST? --------------------编程问答-------------------- 参数化
http://topic.csdn.net/u/20090708/09/b78444ee-9081-4ff7-8aa5-ba6f9b1d9fdc.html --------------------编程问答--------------------
我也想见见! --------------------编程问答-------------------- 二进制注入其实也只是换汤不换药,它把一个SQL先转编为十六进制编码,这样可以绕开你对一些特殊符号的过滤,然后在注入时用CAST函数将其还原,并用exec或execute执行它。所以二进制注入也是需要条件的,需要cast,exec之类的函数没有被过滤掉。
但是不管怎么说,拼接字符串都会有被注入的风险,所以建议用参数化查询语句(使用SqlParameter )或者使用存储过程,这样可以一劳永逸 --------------------编程问答-------------------- 頂一下,學習一下,Marx --------------------编程问答-------------------- 我也从来没见过,发来看看
千万别说,你也没见过
--------------------编程问答-------------------- Friendly Up! --------------------编程问答-------------------- 1楼说的很对,最简单的,如果是数值,在C#里就判断好,不是数值,不进行sql拼接
如果是字符串,拼接sql前后肯定会加单引号,此时只要替换字符串里的单引号为2个单引号就可以了
楼主和16楼所谓的二进制注入,怎么可能实现?
十六进制编码明显不是数值,放在字符串里也被单引号括起来了,有个p用
--------------------编程问答-------------------- 使用存储过程,如果在存储过程里也进行拼接
怎么可能一劳永逸?问题和C#里是一样的
也要判断数值类型,替换单引号。
而拼接sql在某些情况下是必须的
除非你每个参数都这么写:
and (name = :vName or :vName is null)
这样,sql又不使用索引,效率低了(针对Oracle) --------------------编程问答--------------------
你该回去面壁看书了,十六进制需要单引号? 0x12345..... 就OK了,但是我也说了,所谓这种的16进制方式,只不过是可以避开一些符号的限制,如等号,单引号,空格等,也非万能的注入方法。
--------------------编程问答-------------------- 良好的代码风格是最重要的,强烈建议使用SqlParameter,这样即使你使用了SP,并在SP中拼接了字符串,用SqlParameter也可以有效地防止被SQL注入。 --------------------编程问答-------------------- 呵呵,举个例子:
insert into tb values('0x12345')
难道这样存入数据库的会不是0x12345,会变成其它字符?
--------------------编程问答--------------------
这个是16进制。 --------------------编程问答-------------------- 不知道你有没有在存储过程里拼接过sql?
没有拼接过,就不要误导别人,
如果存储过程里有下面的代码:
v_Sql := 'select username from user where id = ''' || vId || '''';
那么一样会有注入问题。
--------------------编程问答-------------------- 而且楼上各位说的所谓二进制注入(16进制也好)
举的例子都是id=xxx
没有判断是否数值就去拼接sql,不出问题才怪
而如果id是字符型,你的sql这么写:id=xxx,一样会报错
所以我再一次支持1楼的说法。 --------------------编程问答-------------------- 用linq不行么? --------------------编程问答--------------------
汗,完全是不知所云了。。。。
你能了解一下什么是SQL注入好吧,N年前就玩烂了的入侵技术了。 --------------------编程问答-------------------- 呵呵,你觉得不了解?
那你就当我不了解吧
那你请指出我说的话的漏洞所在就好
让我也学习一下,我坚持了那么多年的理论是存在问题的。
--------------------编程问答-------------------- 汗。。。。
到底什么是SQL注入呀。。。。 --------------------编程问答--------------------
你觉得表示一个十六进制数需要单引号吗?
下面的代码是一个简单的例子,注入的时候可以灵活地变化成你需要的语句:
declare @s varchar(255)--------------------编程问答-------------------- 不过我前面也说错了,这种方法其实还是需要空格,不过空格也很容易被绕过,比如\t\f\r\n或者/**/这些都可以轻易地取代空格的限制。 --------------------编程问答-------------------- 单纯地过滤单引号是很弱的,比如我union select admin表的数据,根本就用不到单引号。 --------------------编程问答-------------------- 你说的我也理解,无非就是把正常的字符写成16进制的编码
set @s=cast(0x73656c6563742031 as varchar(255))
exec(@s)
但是这个前提要建立在代码中,没有把字符放在单引号里
才能注入成功
你的回答,是把楼主的问题复杂化了
举个例子,如果我的代码是这样的:
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楼是用最简单的方法避免被攻击。
--------------------编程问答-------------------- 作点小修正:
如果是用数值型的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个参数?
或者在一个参数里进行逗号分割之类的?
--------------------编程问答-------------------- 而且不拼接,如何写你的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………………
呵呵 --------------------编程问答-------------------- 算了,扯了半天,没劲,继续搞我的博客去。 --------------------编程问答--------------------
我看了,也是拼接式的注入攻击.
用参数传递,强类型。能够防止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("'","''") +"'";
你们就来注入吧。 --------------------编程问答-------------------- 受教了...长见识了.. --------------------编程问答-------------------- 呵呵,看完全贴。
"你们就来注入吧" --------------------编程问答-------------------- --------------------编程问答--------------------
别以为替换这个了就100%就防注入了,你说话也太小看一些高人了。。。 --------------------编程问答-------------------- 呵呵,
正在等高人……
高人快来攻击啊
补充:.NET技术 , ASP.NET