欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

两个小函数让你的ASP程序对SQL注入免疫!

程序员文章站 2022-06-21 23:18:30
rem ## 长整数转换  function tonum(s, default)  if isnume...
rem ## 长整数转换 
function tonum(s, default) 
if isnumeric(s) and s <> "" then 
tonum = clng(s) 
else 
tonum = default 
end if 
end function 

rem ## sql 语句转换 
function tosql(str) 
if isnull(str) then str = "" 
tosql = replace(str, "''", "''''") 
end function 

示例: 
dim sql 
dim strwhere, strname, intage 
strname = tosql(request("user")) 
intage = tonum(request("age"), 20) 
sql = "select * from [user]" & _ 
"where [age] > " & strname & _ 
" and [username] = ''" & intage & "''" 

一般情况下, 通过上面两个函数的过虑, 可以杜绝网上的sql注入攻击!如果你觉得有需要, 可以加上对chr(0)的替换, 将tosql函数改为如下: 
function tosql(str) 
if isnull(str) then str = "" 
str = replace(str, chr(0), "") 
tosql = replace(str, "''", "''''") 
end function 

另注: 

*********************************************************************** 
检测外部提交的函数 
function checkurlrefer() 
dim strlocalurl, inturllen, strurlrefer 
strlocalurl = "http://127.0.0.1" 
inturllen = len(strlocalurl) 
strurlrefer = lcase(request.servervariables("http_referer") & "") 
''检测前一个页面是否来自 strlocalurl 
if left(strurlrefer, inturllen) = strlocalurl then 
checkurlrefer = true 
else 
checkurlrefer = false 
end if 
end function 
*********************************************************************** 
该函数可以帮助你抵挡外部的sql注入测试, 只需要在页面的头部调用即可. 

通过简单的两个小函数, 让你的asp程序更安全! 

欢迎高手指正(请将绕过这两个函数的方法写出来)! 

相关讨论页面: 
http://community.csdn.net/expert/topicview.asp?id=3585010 
http://community.csdn.net/expert/topicview.asp?id=3582230 

http://community.csdn.net/expert/topic/3589/3589480.xml?temp=.4866449 
///////////////////////////////////////////////////////////////////////////////////////////////////////////// 

dim qs,errc,iii 
qs=request.servervariables("query_string") 
dim nothis(18) 
nothis(0)="net user" 
nothis(1)="xp_cmdshell" 
nothis(2)="/add" 
nothis(3)="exec%20master.dbo.xp_cmdshell" 
nothis(4)="net localgroup administrators" 
nothis(5)="select" 
nothis(6)="count" 
nothis(7)="asc" 
nothis(8)="char" 
nothis(9)="mid" 
nothis(10)="''" 
nothis(11)=":" 
nothis(12)="""" 
nothis(13)="insert" 
nothis(14)="delete" 
nothis(15)="drop" 
nothis(16)="truncate" 
nothis(17)="from" 
nothis(18)="%" 
errc=false 
for iii= 0 to ubound(nothis) 
if instr(qs,nothis(iii))<>0 then 
errc=true 
end if 
next 
if errc then 
response.write("对不起,非法url地址请求!") 
response.end 
end if 

*************************************************************** 

当然这方法做得太“绝”了,但是我也是没有办法啊。这个方法是在网上看到的,运行于一个网站上,现在一切良好。为了安全我只能这样。我想只要有关sql的敏感单词都进行过滤掉应该没有什么吧,当然像楼主的做到那一步是基本上可以了,可以修补一下用用。记得我最初用的是《sql注入天书》上面提供的防范方法,后来才改用这个。 
将我以前用的代码也帖出来供参考,大家有兴趣可以去百度或google中搜索一下《sql注入天书》了解 

使用这个函数,对客户端提交来的数据进行验证。。。 

<% 
function saferequest(paraname,paratype) 
''--- 传入参数 --- 
''paraname:参数名称-字符型 
''paratype:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符) 

dim paravalue 
paravalue=request(paraname) 
if paratype=1 then 
if not isnumeric(paravalue) then 
response.write "参数" & paraname & "必须为数字型!" 
response.end 
end if 
else 
paravalue=replace(paravalue,"''","''''") 
end if 
saferequest=paravalue 
end function%>