Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3160809
  • 博文数量: 797
  • 博客积分: 10134
  • 博客等级: 上将
  • 技术积分: 9335
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 22:57
个人简介

1

文章分类

全部博文(797)

文章存档

2022年(1)

2021年(2)

2017年(2)

2016年(1)

2015年(4)

2014年(1)

2013年(6)

2012年(6)

2011年(10)

2010年(26)

2009年(63)

2008年(61)

2007年(51)

2006年(563)

我的朋友

分类:

2006-08-27 00:58:52

作者:NB联盟-小竹 
ps:老东西了,没别的意思。对曾经促进过网络安全事业的54nb的一点怀念吧!
  SQL注入越来越多的被利用来入侵网站,部分WEB程序员也开始关注这方面的知识,但由于对入侵的方法一知半解,导致在过滤的时候漏掉某些字符,造成安全漏洞;或者是草木皆兵,把一些合法的用户请求都拒之门外,试想一下,当用户想输入个I'm a boy的时候,却给你臭骂一顿,他还会愿意再上你的网站吗? 

下面,我从程序方面介绍一下SQL注入的防御方法,首先看这三句最简单SQL语句 
1.SQL="select * from Users where UserID=" & Request("ID") 
2.SQL="select * from Users where UserID='" & Request("ID") & "'" 
3.SQL="select * from Users where UserName like '%" & Request("Name") & "%'" 


第一句,参数是数字型,这个很明显。第二句,如果字段UserID是int型,就有些人分不清楚了。其实,区分第数字弄和字符型参数,只要看SQL语句参数两边有没有单引号即可,很明显,第一句没单引号,是数字型;第二第三句有单引号,是字符型。 

  对于数字型变量,传入的参数都会直接附加到SQL语句上执行,而因为参数是数字型,所以用isNumeric判断是很安全的,我曾经试过用\0之类试图断开参数,但结果都是失败。 

  对于字符型变量,传入的参数都是做为常量,比如你传1 and 1=1进去,SQL语句就是UserID='1 and 1=1',在单引号界定范围里面的值永远都只是一个常量,要打破这个范围,唯一的字符就是界定的字符:单引号。所以,字符型变量只要过滤了'号就完全安全了,至于如何过滤,最好是把一个单引号替换成两个单引号,因为SQL语句里面规定,'常量'这样表示的常量里面,常量里面如果要有单引号,可以用两个单引号代替。这样,既可以保持用户输入的原貌,又可以保证程序的安全。 

  下面是两个函数,大家可以Copy过去直接调用就行了。 
'----------------------------------- ---------------------------- 
' NB联盟防注入函数 ReqNum / ReqStr 
'----------------------------------- ---------------------------- 
Function ReqNum ( StrName ) 
ReqNum = Request ( StrName ) 
if Not isNumeric ( ReqNum ) then 
Response.Write "参数必须为数字型!" 
Response.End 
End if 
End Function 

Function ReqStr ( StrName ) 
ReqStr = Replace ( Request(StrName), "'", "''" ) 
End Function 


以上面三句SQL语句,说明一下调用方法: 
1.SQL="select * from Users where UserID=" & ReqNum("ID") 
2.SQL="select * from Users where UserID='" & ReqStr("ID") & "'" 
3.SQL="select * from Users where UserName like '%" & ReqStr("Name") & "%'" 


  重申一点:上面的方法无论对SQLServer库还是Access或是其它数据库,都是绝对适用、绝对安全,但注意一点,SQLServer的存储过程是个例外,该情况下要把单引号替换成四个单引号,以保安全。 
阅读(611) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~