菜头粿

查看: 330|回复: 0
打印 上一主题 下一主题

SQL注入防御方法-程序员篇

[复制链接]
1#
跳转到指定楼层
发表于 2009-8-29 12:14:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式





SQL注入防御方法-程序员篇
SQL注入防御方法-程序员篇



  作者:NB联盟-小竹

  SQL注入越来越多的被利用来入侵网站,部分WEB程序员也开始关注这方面的知识,但由于对入侵的方法一知半解,导致在过滤的时候漏掉某些字符,造成安全漏洞;或者是草木皆兵,把一些合法的用户请求都拒之门外,试想一下,当用户想输入个I'maboy的时候,却给你臭骂一顿,他还会愿意再上你的网站吗?

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

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

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

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

  下面是两个函数,大家可以Copy过去直接调用就行了。

'---------------------------------------------------------------
'NB联盟防注入函数ReqNum/ReqStr
'---------------------------------------------------------------
FunctionReqNum(StrName)
ReqNum=Request(StrName)
ifNotisNumeric(ReqNum)then
Response.Write"参数必须为数字型!"
Response.End
Endif
EndFunction

FunctionReqStr(StrName)
ReqStr=Replace(Request(StrName),"'","''")
EndFunction

以上面三句SQL语句,说明一下调用方法:
1.SQL="Select*fromUserswhereUserID="&ReqNum("ID")
2.SQL="Select*fromUserswhereUserID='"&ReqStr("ID")&"'"
3.SQL="Select*fromUserswhereUserNamelike'%"&ReqStr("Name")&"%'"

  重申一点:上面的方法无论对SQLServer库还是Access或是其它数据库,都是绝对适用、绝对安全,但注意一点,SQLServer的存储过程是个例外,该情况下要把单引号替换成四个单引号,以保安全。

另外,NB联盟-裤衩曾经写过一篇SQLServer安全设置的文章,在程序有漏洞的时候,该文章可以让入侵者或得尽可能少的权限及数据,该文章已经发表在www.54NB.com,有兴趣的可以去看看。

本帖最后由小竹在2004-12-2013:20:32编辑.



高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|Archiver| 菜头粿 声明:本站所发贴子内容仅代表网友观点,不代表本站立场,严禁一切与国家法律相抵触的内容。感谢关注!
粤icp备19073828

GMT+8, 2026-7-26 19:39 , Processed in 0.129191 second(s), 15 queries .

粤东.中国

© 2007-2026 czczcz.com

快速回复 返回顶部 返回列表