预防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
这里下,就可以了!
评论
checkStr=replace(str,"mid"," ")
假如用户名叫“Lumida”……
在进行防御的时候,如果设计不当,很容易产生更多更麻烦的问题,未免本末倒置了。不是吗?
还有,你能够谈谈你的经验最好不过!
总之,过滤字母字符串似乎不妥……
而且,“过滤法”防注入本来就显得太过被动了。说不定你明天想起还得过滤EXEC,后天又想到了CHAR,这样看起来越来越坚固,但引入的问题也越来越多。
其实网上有许多介绍SQL注入的文章,我个人的思路是:
1、如果是排除法防注入,那么应该重点处理符号而非字母字符串。因为可用性应该放在首位,我们不能要求用户Lumida改名字是不是?
2、除了非法字符串以外,我们还应该考虑比如过长字符串在内的一些另类情况,所以用正则表达式(编写理想的数据形式模式)进行主动验证要比被动的过滤法方便一些(引入的问题是无法容错);
3、其实用存储过程可以很大程度上防止注入,这点大家都知道了。不过,也不一定,要看存储过程如何调用——如果式ADO,不要吝啬代码,使用Command和Parameter是很明智的。
说真的,我觉得黑客很难琢磨。
假如,我们花费了1000个成本单位去做了一个许多B/S顶级高手甚至黑客都认为无懈可击的方法来防止SQL注入(开发一个普通的OA大概也就1000个成本单位)。但黑客入侵服务器,很可能根本就不是通过SQL注入……
所以,我不是一个好的程序员,才会说:可能定期BackUp更重要吧?呵呵。
相关地址:
http://blog.csdn.net/oyiboy/archive/2004/07/29/55030.aspx
算是交流!!!
其实看楼上你的函数,我觉得还是长度限制是最好方法!!!我个人不太赞成对URL长度的限制,这样不够灵活!!还是对具体QueryString值做处理还要安全点,因为每次使用都自己心里有个数!就是有点麻烦!但是安全第一嘛!
楼上看这里!
----<%
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(靳田) 说的思路里已经可以看出端倪了啊!一定要结合自己的情况来使用!