引言 在ASP开发中,直接使用字符串拼接来构建SQL查询语句,会使得应用程序面临严重的SQL注入攻击风险。这是经过大量实际安全事件验证的结论。为了有效抵御此类攻击,开发者通常可以采用两种核心防护策略:敏感词过滤与参数化查询。本文将详细介绍这两种方法在ASP项目中的具体实现与应用。 敏感词过滤机制 D
在ASP开发中,直接使用字符串拼接来构建SQL查询语句,会使得应用程序面临严重的SQL注入攻击风险。这是经过大量实际安全事件验证的结论。为了有效抵御此类攻击,开发者通常可以采用两种核心防护策略:敏感词过滤与参数化查询。本文将详细介绍这两种方法在ASP项目中的具体实现与应用。
Dim Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr,Kill_IP,WriteSql
‘自定义需要过滤的字符串,使用“|”进行分隔
Fy_In = “‘|;|and|(|)|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|exist|drop"
Kill_IP=True
WriteSql=True ‘----------------------------------
Fy_Inf = split(Fy_In,"|")
‘--------POST部分------------------
If Request.Form<>“” Then
For Each Fy_Post In Request.Form
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>0 Then
Response.Redirect “/index.asp"
Response.End
End If
Next
Next
End If
If Request.QueryString<>“” Then
For Each Fy_Get In Request.QueryString
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then
Response.Redirect “/index.asp"
Response.End
End If
Next
Next
End If
上述代码实现了一种基础的敏感词过滤方案。其原理是在用户提交的请求数据(包括POST表单数据和GET查询参数)进入系统处理流程之前,进行预先扫描。代码定义了一个包含常见SQL关键字和特殊字符(例如‘select’、‘exec’、‘drop’等)的黑名单。系统会遍历所有传入的数据,一旦检测到任何黑名单中的词汇,便会立即中断当前请求,并将用户重定向至首页等安全页面。这种方法如同在数据库外围设置了一道基础安检门,能够阻挡大量常见的、模式化的SQL注入攻击尝试。
Public Function execSqlOpen(connect,cursorType,lockType,args())
set cmdTemp = server.CreateObject(“ADODB.Command")
cmdTemp.ActiveConnection = connect
cmdTemp.Prepared = true
cmdTemp.CommandText = args(0)
Dim i
For i = 1 To UBound(args)
set paramTemp = cmdTemp.CreateParameter(“”,201,1,Len(args(i))+10,args(i))
cmdTemp.Parameters.Append paramTemp
Next
set rsTemp=server.CreateObject(“adodb.recordset")
rsTemp.open cmdTemp,,cursorType,lockType
set execSqlOpen = rsTemp
end function
Public Function execSqlExecute(connect,args())
set cmdTemp = server.CreateObject(“ADODB.Command")
cmdTemp.ActiveConnection = connect
cmdTemp.Prepared = true
cmdTemp.CommandText = args(0)
Dim i
For i = 1 To UBound(args)
set paramTemp = cmdTemp.CreateParameter(“”,201,1,Len(args(i))+10,args(i))
cmdTemp.Parameters.Append paramTemp
Next
set execSqlExecute = cmdTemp.execute
end function
与基于黑名单的敏感词过滤不同,参数化查询是一种从编程模型上杜绝SQL注入的更安全方案,属于“白名单”思路。它将SQL命令的代码结构与用户输入的数据严格分离。上面提供的两个封装函数——execSqlOpen和execSqlExecute——正是为了实现这一目的。在改造旧代码时,需要遵循以下几点核心原则:
Recordset.Open执行查询并返回记录集的地方,应改用execSqlOpen函数(若原代码有调用close,需保留);原先使用Connection.Execute或Command.Execute仅执行操作的地方,应改用execSqlExecute函数(此处无需close)。set语句接收函数返回值;仅执行更新、插入等不返回记录集的操作,使用call调用即可。以下通过几个具体示例来演示如何将传统拼接SQL的代码改造为参数化形式:
‘改造前 sql=“select * from table where column=‘”&column&“‘" set rs=server.CreateObject(“ADODB.recordset") rs.Open sql,conn,1,1 ‘改造后 dim args args = Array(“select * from table where column = ”,column) set rs = execSqlOpen(conn,1,1,args)
‘改造前 sql=“select * from table where 1=1 and column1=‘”&request(“column1")&“‘" if column2<>“” then sql=sql&“ and column2 like ‘%”&column2&“%'" end if if column3<>“” then sql=sql&“ and column3 =”&column3&“" end if sql=sql&“ order by column4 desc;" Set rs= Server.CreateObject(“ADODB.Recordset") rs.open sql,conn,1,1 ‘改造后 dim args args = Array(“select * from table where 1=1 and column1=”,request(“column1")) if column2<>“” then args(0)=args(0)&“ and column2 like " ReDim Preserve args(UBound(args)+1) args(UBound(args)) = “%”&column2&“%" end if if column3<>“” then args(0)=args(0)&“ and column3 =" ReDim Preserve args(UBound(args)+1) args(UBound(args)) = column3 end if args(0)=args(0)&“ order by column4 desc;" set rs = execSqlOpen(conn,1,1,args)
‘改造前 Set Rs_t=Conn.Execute(“Select column From "&table&“ where column1=”&column1) ‘改造后 dim args args = Array(“Select column From "&table&“ where column1=”,column1) set Rs_t = execSqlExecute(conn,args)
此例中,表名(table变量)因需动态确定,保留了字符串拼接方式;而查询条件(column1)则使用了参数化占位符,这是推荐的做法。
‘改造前‘ set rs=conn.execute(“select * from table where column=”&request(“column")) ‘改造后 dim args args = Array(“select * from table where column = ”,request(“column")) set rs = execSqlExecute(conn,args)
‘改造前 conn.execute(“update table set column = ‘”&column&“‘") ‘改造后 dim args args = Array(“update table set column = ”,column) call execSqlExecute(conn,args)
总结:为ASP应用提升SQL注入防护能力,敏感词过滤可作为第一道快速防护网,而参数化查询则是从根本上解决问题的更优方案。在对现有ASP项目进行安全加固时,结合实际场景将这两种方法结合运用,可以大幅度降低SQL注入攻击的成功率。本文提供的代码示例与改造指南,旨在为开发者提供一条清晰可行的技术实施路径。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述