昊 天

预防SQL注入漏洞函数. (摘自:最爱白菜)

 

仅仅代表我的观点.不怕见笑.有问题请大家指教!我想如果你是牛人,那这个已经不是值得你看的内容,只是觉得对与很多刚入门的ASP程序员来说还是有点实际意义,所以不怕被大家笑话,写了贴在这里!

----<%
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

%>


相关函数
Left(string, length)
 返回指定数目的从字符串的左边算起的字符
 
Asc(string)
 返回与字符串的第一个字母对应的 ANSI 字符代码。
 
Mid(string, start[, length])
 从字符串中返回指定数目的字符。
 
***********************************
我自己的做法是把字符串限定在8个字符内,呵!(千万条数据啊,没谁有这样大的记录吧?99,999,999呵!不够用,才怪了!除非你的数据从来不更新删出,那也没办法,问题是sql到了这样的时会是怎么样的速度)


---<%
if len(request.querystring("ddd"))> 8 then
response.write(黑我啊,不要了。少来)
response.end '最好有这句

'''初步是判断是否是数字=======IsNumeric 函数
if IsNumeric(request.querystring("ddd")) then

Execute("select * from [table]")

....

else

response.write(黑我啊,不要了。少来)
response.end '最好有这句

%>

当然了,加上上面的函数,在你的SQL过程里,效果就非常完美了!

呵!!!在变态点做个函数。

---<%
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,"$","'")

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

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

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

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

'''呵!!我这里没屏蔽select,count,哈!想起来我就笑,太变态了,那其不是我什么都不用了不是更更安全啊!!!呵!!~^)^~
end function

%>


足够了,这个函数加载到sql选取记录集的地方。
如:rsql="select * from table where xxx="&checkstr(request.querystring("xxyy"))&""
或者来就判断字符串

说的有点林乱,但是就是这些了,对于普通的“黑客”已经足够他毫些时间了。但是对于老到的真正意义的黑客,这些都不是万能的东西,人家连服务器都黑,你能怎么样啊?嘿!!

看了些资料,结合自己的经验,写在这里。算是自己复习一下,看到的朋友也可以一起交流!QQ:22979784(加的请说明这篇文章的地址,怕扰啊!多多见谅了!)

另外对于sql注入漏洞,好象只是ASP里多些!其它的我还不是太清楚,所以还是需要提醒所有搞ASP的朋友,请多看看,微软的最新【windows 脚本技术】这个东西。
http://download.microsoft.com/download/winscript56/Install/5.6/W982KMe/CN/scd56chs.exe
这里下,就可以了!

发表于 2004年07月24日 6:37 PM

评论

# 回复:预防SQL注入漏洞函数 2004-07-24 6:53 PM 最爱白菜!
很是简单!!!如果你觉得有用,就请想想为什么,如果你觉得实在是简单,请你不要骂我!!!谢谢合作!

# 回复:预防SQL注入漏洞函数 2004-07-24 9:29 PM Estyle(靳田)
暂且不论防注入,就以下用法,我就觉得很值得商劝:
checkStr=replace(str,"mid"," ")
假如用户名叫“Lumida”……
在进行防御的时候,如果设计不当,很容易产生更多更麻烦的问题,未免本末倒置了。不是吗?

# 回复:预防SQL注入漏洞函数 2004-07-24 11:20 PM 最爱白菜
呵!!!Estyle(靳田) ,你到是蛮仔细的!!!!函数可能是变态点。呵!有点过头了!不过MID函数是必须过滤你是知道的。我是没想那么多,主要是过滤?id=xxx&sort=yyy之类的入侵。所以个人觉得这样的事情一般是自己的使用习惯结合来说的。当然这个是分析上的误差。是可以直接避免这样的问题发生的。在不行就对MID关键字做判断,变量传递过去使用,这个问题就不存在了!呵!!总之谢谢你的提醒!!过天加上去!

还有,你能够谈谈你的经验最好不过!

# 回复:预防SQL注入漏洞函数 2004-07-25 1:06 AM Estyle(靳田)
我倒不觉得有过滤MID的必要,你已经过滤了括号了啊?
总之,过滤字母字符串似乎不妥……
而且,“过滤法”防注入本来就显得太过被动了。说不定你明天想起还得过滤EXEC,后天又想到了CHAR,这样看起来越来越坚固,但引入的问题也越来越多。
其实网上有许多介绍SQL注入的文章,我个人的思路是:
1、如果是排除法防注入,那么应该重点处理符号而非字母字符串。因为可用性应该放在首位,我们不能要求用户Lumida改名字是不是?
2、除了非法字符串以外,我们还应该考虑比如过长字符串在内的一些另类情况,所以用正则表达式(编写理想的数据形式模式)进行主动验证要比被动的过滤法方便一些(引入的问题是无法容错);
3、其实用存储过程可以很大程度上防止注入,这点大家都知道了。不过,也不一定,要看存储过程如何调用——如果式ADO,不要吝啬代码,使用Command和Parameter是很明智的。

说真的,我觉得黑客很难琢磨。
假如,我们花费了1000个成本单位去做了一个许多B/S顶级高手甚至黑客都认为无懈可击的方法来防止SQL注入(开发一个普通的OA大概也就1000个成本单位)。但黑客入侵服务器,很可能根本就不是通过SQL注入……
所以,我不是一个好的程序员,才会说:可能定期BackUp更重要吧?呵呵。

# 回复:预防SQL注入漏洞函数 2004-07-25 1:32 AM magicmaster
没有必要这样检查,浪费资源,只需检查直接接代入SQL语句部分即可,&#65;之类用asc表示关键字你怎么办?

# 回复:预防SQL注入漏洞函数 2004-07-29 9:00 AM 布丁龙
对于SQL注入方式我也有一种方法。不过不知道能不能使用。所以专门在我的Blog里加了一篇。白菜兄和靳兄,还有感兴趣的人可以去看看,帮我看看有什么漏洞..

相关地址:
http://blog.csdn.net/oyiboy/archive/2004/07/29/55030.aspx

# 回复:预防SQL注入漏洞函数 2004-07-29 12:42 PM 最爱白菜
去你那里回了比你内容还要多的东西.呵!!!

算是交流!!!

其实看楼上你的函数,我觉得还是长度限制是最好方法!!!我个人不太赞成对URL长度的限制,这样不够灵活!!还是对具体QueryString值做处理还要安全点,因为每次使用都自己心里有个数!就是有点麻烦!但是安全第一嘛!

# 回复:预防SQL注入漏洞函数 2004-08-04 11:56 AM
你这个 连 'or''='这种注入都防不住啊,你没加这里面的字符做替换啊

# 回复:预防SQL注入漏洞函数 2004-08-06 10:19 AM 最爱白菜
更正:::::
楼上看这里!
----<%
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

%>

我说的只是一种思路的问题,你可以结合实际加上自己的处理方式的啊!!!!比如你说的问题处理"or"或"="这些都可以的说!只是没这样的必要!具体该怎样用,那得结合你的情况了!我说的这个函数只 有通用性,没有必要全部照着用啊!再说一遍,我的只是思路!因为通用不通用的问题上,Estyle(靳田) 说的思路里已经可以看出端倪了啊!一定要结合自己的情况来使用!

posted on 2004-08-21 15:52  Tutuya  阅读(831)  评论(0编辑  收藏  举报