关于网站防注入的一点疑问?
看了些前辈们总结的防注方面的资料,认识到网站防注大概有两种方法:
方法一:
在接出数据的时候使用函数检测,
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之类的。第一个函数接收地址栏参数不错,觉得存储数据就用另外的函数好。