轻灵自由的珍珠

一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。自始至终,目标明确。既没有不必要的循环也没有没有被引用的变量,既不缺少结构化也不至于僵硬呆板。

原创 关于SQL注入防御函数收藏

新一篇: XML与ASP简单结合实现HTML模板功能 | 旧一篇: 500-100.asp文件

刚刚在最爱白菜那里看到了一个SQL注入防御的函数,突然想起以前看到这些文章时的一直有个问题想不通的,我对于SQL注入的防御很简单,就以下两个函数:

'####
'##
'## SQL注入攻击预防装置[字符型]
'##
'## @ data  ->处理的数据
'## @ length ->长度限制
'##
'## 例: strSql("SQL字符型数据",50)
'##
function strSql(data,length)
'########################################################################
 if length<>0 then data=left(data,length)
 strSql="'"&replace(data,"'","''")&"'"
end function

'####
'##
'## SQL注入攻击预防装置[数字型]
'##
'## @ numeric ->数字
'##
'## 例: intSql(50)
'##
'## 2004/03/04,改良版,原因:IsNumeric检测MSSQL数据类型时会误判。
'##
function intSql(Numeric)
'########################################################################
 dim MM_intTemp
 On Error Resume Next
 if Numeric="" then Numeric=0
 MM_intTemp=csng(Numeric)
 if err=0 then
  intSql=Numeric
 else
  intSql=0
 end if
end function

strSQL的length不在防御SQL注入的范围中,是我为了防止插入字符超过字段长度而出错作的一个小小的防御。
我在网上看到各式各样的SQL注入防御函数,所以很好奇,这样的函数不能防御注入吗?谁知道这两个函数的漏洞请告诉我。

发表于 @ 2004年07月29日 08:54:00|评论(loading...)|编辑

新一篇: XML与ASP简单结合实现HTML模板功能 | 旧一篇: 500-100.asp文件

评论

#布丁龙 发表于2004-07-29 13:53:00  IP: 218.68.237.*
to 最爱白菜

我想我还是有必要重申一点的,我那个length和防御SQL注入无关的,只是为了防止插入字符过长而出错.因为所有字符字段都有一个长度的,如果超过就出错了.所以我在这里作了一个截断.

-----------引用"最爱白菜 "-----------
这对于稍微认识深点的人来说,做数字判断已经不起太大作用了,呵!!!
-----------引用"最爱白菜 "-----------
SQL注入,无非就是在变量中注入一条或多条非法SQL语句.一条SQL绝对不可能只用数字表示.包括SQL Encoder也是以0x打头的十六进制数据而存在的.所以我不认为csng不能过虑一整条SQL.

关于IsNumeric(expression)我的数字型在一开始也是使用这个函数,但是因为我们习惯直接使用rs(objname)来读取数据集内的数据,我们看是没问题,但是在程度中确是以对象方式来处理的,如果用直接判断rs(objname),程序会不管是数字不是字符都会判断为非数字型.这个让我头痛了好一段时间才决定使用On Error Resume Next和csng来完成这个任务.
#最爱白菜 发表于2004-07-29 10:36:00  IP: 220.163.37.*
-14367-15895-10284-11319-19004-10780-10519

轻灵自由的珍珠

3 97 100 109 105 110

admin

45

-

是ASCII码!!!!哈!!!!!你说这是数字么!?是单精度的!(Single 子类型)

Chr 函数
请参阅
Asc 函数
要求
版本1
返回与指定的 ANSI 字符代码相对应的字符。

Chr(charcode)
charcode 参数是可以标识字符的数字。
函数 Chr 可以把ASCII码数字转换成字符。 例如,函数 Chr (65) = "A" 就可以把数字 65 转换成字母 "A"。


61 64 6D 69 6E

admin

是admin的16进制!!!哈!!!!

C7 E1 C1 E9 D7 D4 D3 C9 B5 C4 D5 E4 D6 E9

轻灵自由的珍珠

是轻灵自由的珍珠的16进制!!!!哈!!!!

现在我不用多说什么了吧!?

所以我个人看法还是限制长度是最不是办法的办法,还有就是过滤重要的函数类型!!!呵!!!

这个东西我也还研究透彻!!!
#最爱白菜 发表于2004-07-29 10:37:00  IP: 220.163.37.*
说错,我还没研究透!!!只能够把我想到的随便说说!!!
#最爱白菜 发表于2004-07-29 10:39:00  IP: 220.163.37.*
还有

英文 '

27是它的16进制码!

39是它的ASCII码!!!

#最爱白菜 发表于2004-07-29 10:40:00  IP: 220.163.37.*
当然这些符号过滤对于部分用户来讲,还是有必要的!

要不然随便看看相关教程,照样搞你!!!真是麻烦!!!!!
#布丁龙 发表于2004-07-29 11:01:00  IP: 218.68.237.*
to grief
东西能用就好,不用太高深的.

to 白菜

我这两个函数是根据字段的数据类型进行选择的.如:int型字段不可能出现字符,那就是用intSQL来过虑.
还有,我看不太明白你的意思,你列出那个chr函数是什么用意?

还有我说了,那个length只是为了限制长度,而和防御注入没关系的.

-----------引用"最爱白菜 "-----------
要不然随便看看相关教程,照样搞你!!!真是麻烦!!!!!
-----------引用"最爱白菜 "-----------
那你帮我搞搞下面这句吧
SQL="select * from database where name=" & strSQL(request("name"),50) & " and [id]=" & intSQL(request("ID"))

当request("name")和request("ID")为什么值是能注入呢?
#布丁龙 发表于2004-07-29 11:05:00  IP: 218.68.237.*
我真的很笨,我每次用这个函数说可以防御注入时都有人列出这个ASCII来,但是我始终想不通,这个和我的函数能不能防御SQL注入有什么关系.还请最爱白菜兄指点一下.
#最爱白菜 发表于2004-07-29 12:37:00  IP: 220.163.37.*
呵!!!

其实我说的也说错误了些,刚好想来弥补!!!基础的东西都搞糊涂了!该打自己了!!汗!!!

至于你说的,ASCII列出来的问题,我想主要是针对:

IsNumeric 函数

要求
版本 1
返回 Boolean 值指明表达式的值是否为数字。

IsNumeric(expression)
expression 参数可以是任意表达式。

这里的判断吧!!!你说是不是!?呵!!!不过有这个判断总比没有的好!!用户类型不同喔!!

“还有,我看不太明白你的意思,你列出那个chr函数是什么用意? ”

是针对在注入时圈套使用的时候用得到的说!有时间!当然一般情况下这样就把自己搞复杂了,至少我用不到。没那个耐性!!!呵!!!(只是说存在这样的问题)。

这对于稍微认识深点的人来说,做数字判断已经不起太大作用了,呵!!!

SQL="select * from database where name=" & strSQL(request("name"),50) & " and [id]=" & intSQL(request("ID"))

呵!!!我看没问题嘛!!!你的目录数不大的话,这样用一点问题没有的吧!?和我说的长度判断也差不多原理嘛!(实际上一般我想50也够了)

反正说半天是,这个问题住要是自己清楚自己的情况,结合自己的使用方法就可以,防小人不防君子!(我是抱点幻想来着)呵!!越想这样的问题,越觉得头大了!
#grief 发表于2004-07-29 09:22:00  IP: 60.26.67.*
呵呵,我还以为什么高深的技术呢。。
#LLeaves 发表于2004-08-29 11:14:00  IP: 218.79.80.*
对啊,是没怎么高深的。反正,数值的就IsNumeric一下,字符串的就把单引号替换成空。这是我最喜欢的方法。
#piggybank 发表于2004-09-14 13:10:00  IP: 218.63.93.*
>对啊,是没怎么高深的。反正,数值的就IsNumeric一下,字符串的就把单引号替换成空。这是我最喜欢的方法。

是数值,CLng()没错才行——因为还有十六进制
'->'',ok

服务器端设置好了最重要——又不难。
#鱼 发表于2004-09-21 10:24:00  IP: 218.15.236.*
过滤空格(某些场合)+过滤单引号(有时还要包括一些SQL特殊符号)+限制长度(某些场合)+如果不是文本类型的则判断提交的数据类型+如果是数字类型(0-9的数字范围)的则建议不要使用IsNumeric函数,自己写一个吧,这样就可以防止部分十六进制数(A以上的值)

这几样一起做,应该是暂时最好的方法吧。。。呵
#扬帆 发表于2004-10-09 11:47:00  IP: 218.104.1.*
一般来说,我把以下字符过滤
' ; ( ) - = 只有数字id的时候还过滤 and or 之类的,基本上就差不多了
#kinotor 发表于2004-10-25 16:47:00  IP: 211.94.150.*
----<%
Function checkStr(str)

if isnull(str) then

checkStr = ""

exit function

end if

checkStr=replace(str," ","")

checkStr=replace(str,"'","''")'<<===这里少写了点东西(单引号)!呵!

checkStr=replace(str,";","'")

checkStr=replace(str,"--","'")

checkStr=replace(str,"(","'")

checkStr=replace(str,"[","'")

checkStr=replace(str,"$","'")

end function

%>
#Leeleilei 发表于2004-11-23 22:39:00  IP: 219.147.62.*
... ...
#shrimps 发表于2005-08-26 02:06:00  IP: 211.100.4.*
< %
Function checkStr(str)

if isnull(str) then

checkStr = ""

exit function

end if

str=replace(str," ","")

str=replace(str,";","'")

str=replace(str,"--","'")

str=replace(str,"(","'")

str=replace(str,"[","'")

str=replace(str,"$","'")

checkStr=replace(str,"'","''")

end function

% >

这个样子才算是正确的啊
#shrimps 发表于2005-08-26 02:06:00  IP: 211.100.4.*
< %
Function checkStr(str)

if isnull(str) then

checkStr = ""

exit function

end if

str=replace(str," ","")

str=replace(str,";","'")

str=replace(str,"--","'")

str=replace(str,"(","'")

str=replace(str,"[","'")

str=replace(str,"$","'")

checkStr=replace(str,"'","''")

end function

% >

这个样子才算是正确的啊
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 布丁龙