首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > ASP >

关于网站防注入的一点疑问?解决方法

2012-02-21 
关于网站防注入的一点疑问?看了些前辈们总结的防注方面的资料,认识到网站防注大概有两种方法:方法一:在接

关于网站防注入的一点疑问?
看了些前辈们总结的防注方面的资料,认识到网站防注大概有两种方法:
方法一:
在接出数据的时候使用函数检测,
Function   SafeRequest(ParaName,ParaType)
              '---   传入参数   ---
              'ParaName:参数名称-字符型
              'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

              Dim   ParaValue
              ParaValue=Request(ParaName)
              If   ParaType=1   then
                            If   ParaValue= " "   or   not   isNumeric(ParaValue)   then
                                          Response.write   "参数 "   &   ParaName   &   "必须为数字型! "
                                          Response.end
                            End   if
              Else
                            ParaValue=replace(ParaValue, " ' ", " ' ' ")
              End   if
              SafeRequest=ParaValue
End   function

方法二:
在链接数据库的文件中加入如下代码:
<%
On   Error   Resume   Next
dim   sql_leach,sql_leach_0,Sql_DATA,SQL_Get,Sql_Post  
sql_leach   =   " ',and,exec,insert,select,delete,%,*,update,count,chr,mid,master,truncate,char,declare "
sql_leach_0   =   split(sql_leach, ", ")

If   Request.QueryString <> " "   Then
For   Each   SQL_Get   In   Request.QueryString
For   SQL_Data=0   To   Ubound(sql_leach_0)
if   instr(Request.QueryString(SQL_Get),sql_leach_0(Sql_DATA))> 0   Then
Response.Write   "请不要在参数中使用 ',and,insert,select,delete等字符! "
Response.end
end   if
next
Next
End   If

If   Request.Form <> " "   Then
For   Each   Sql_Post   In   Request.Form
For   SQL_Data=0   To   Ubound(sql_leach_0)
if   instr(Request.Form(Sql_Post),sql_leach_0(Sql_DATA))> 0   Then
Response.Write   "请不要在参数中使用 ',and,insert,select,delete等字符! "
Response.end
end   if
next
next
end   if
%>

现在问题是这样的,我的网站已经完成,用方法一的话好多网页都要改动,比较麻烦,就用了方法二,但用这种方法时当用户填写留言时就不能出现 " ',and,exec,insert,select,delete,%,*,update,
count,chr,mid,master,truncate,char,declare "这些字符了.可and,%也是常用的字符呀!
不知大家是用什么方法防注的?
有没有更好的方法呀?

[解决办法]
使用RecordSet对象来操作,就可以防止injection
我个人比较喜欢使用RecordSet操作数据库,牺牲一些性能换取安全性,我认为比较值得~
[解决办法]
鱼与熊撑不可得兼.
我总是用第一种方法.
[解决办法]
我用方法一,把它做一点小小的改动,
ParaValue=replace(ParaValue, " ' ", " ' ' ") 这句更据数据库类型改为


ParaValue=replace(ParaValue, " ' ", " '+ char(39) + ' ") 或
ParaValue=replace(ParaValue, " ' ", " '+ nchar(39) + ' ")

这样可以把提交的内容原汁原味保存在数据库中,
[解决办法]
变量进来时,检查变量的合法性。
[解决办法]
fl99(笨笨(QQ:250009333)) ( ) 信誉:100 Blog 加为好友 2007-5-18 0:37:27 得分: 0


我用方法一,把它做一点小小的改动,
ParaValue=replace(ParaValue, " ' ", " ' ' ")

----------------------------------------------
在你看来,这句会产生输入一个 '显示两个的效果了?





[解决办法]
做一个类型转换函数
Public Function ChangeType(vtIn, ByVal vtType)
Dim ret
Select Case vtType
Case vbEmpty
Case vbNull
ret = Null
Case vbInteger
ret = ChangeType(vtIn, vbDouble)
If ret > = -32768 And ret <= 32767 Then
ret = CInt(ret)
Else
ret = 0
End If
Case vbLong
ret = ChangeType(vtIn, vbDouble)
If ret > = -2147483648 And ret <= 2147483647 Then
ret = CLng(ret)
Else
ret = CLng(0)
End If
Case vbSingle
If IsNumeric(vtIn) Then
ret = CSng(vtIn)
Else
ret = CSng(0)
End If
Case vbDouble
If IsNumeric(vtIn) Then
ret = CDbl(vtIn)
Else
ret = CDbl(0)
End If
Case vbCurrency
ret = ChangeType(vtIn, vbDouble)
If ret > = -922337203685477.5808 And ret <= 922337203685477.5807 Then
ret = CCur(ret)
Else
ret = CCur(0)
End If
Case vbDate
If IsDate(vtIn) Then
ret = CDate(vtIn)
End If
Case vbString
If Not IsNull(vtIn) Then
ret = CStr(vtIn)
Else
ret = " "
End If
Case vbBoolean
ret = ChangeType(vtIn, vbDouble)
ret = CBool(Not ret = 0)
Case vbByte
ret = ChangeType(vtIn, vbDouble)
If ret > = 0 And ret <= 255 Then
ret = CByte(ret)
Else
ret = CByte(0)
End If
Case Else
'自己根据具体需求写
End Select
ChangeType = ret
End Function

Dim sql
sql = "SELECT * FROM [Table] WHERE ID= " & ChangeType(Request.Form( "ID "), vbLong)
这个sql语句是安全的

数字类型的数据转换不成功,则默认为0,这样避免了搜索整数类型数据时的sql注入

文本类型的数据检索可以用adodb.command,或者替换 '为 ' ',然后去掉Chr(0)即可,如果是模糊搜索,还要去掉%[]这几个字符

[解决办法]
ParaValue=replace(ParaValue, " ' ", " ' ' ") 这句更据数据库类型改为
ParaValue=replace(ParaValue, " ' ", " '+ char(39) + ' ") 或
ParaValue=replace(ParaValue, " ' ", " '+ nchar(39) + ' ")

如果是从表单提交的,这样还是会存在一些问题吧?比如XXS hacking之类的。第一个函数接收地址栏参数不错,觉得存储数据就用另外的函数好。

热点排行