ASP防SQL注入攻击技巧实例教程详解
引言
在ASP项目中,如果SQL查询直接使用了字符串拼接,那么整个应用就向SQL注入攻击敞开了大门。这可不是危言耸听,而是无数安全事件反复验证过的现实。好在,我们手头有两件相当趁手的“武器”来加固防线:敏感词过滤与参数化语句。接下来,我们就来深入聊聊这两种方法的实战应用。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
敏感词过滤
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参数)流入系统之初,就进行一次“安检”。它会遍历一个预定义的敏感词清单(比如“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字符串拼接逻辑,改造为使用参数数组的形式。
具体实施时,有几个关键点需要牢记:
- 1. 原代码使用Recordset.Open的地方,改用execSqlOpen函数(注意,如果原代码有调用close,需保留);原代码使用Connection.Execute或Command.Execute的地方,改用execSqlExecute函数(此处无需close)。
- 2. 需要返回记录集(Recordset)的,用set语句接收返回值;仅仅执行操作的(如Update、Insert),用call调用即可。
- 3. 有一种特殊情况:表名本身需要动态拼接。由于参数化占位符不能用于表名、列名等数据库对象,这部分仍需保留原始的字符串拼接方式。
- 4. 对于使用LIKE进行模糊查询的情况,技巧是在SQL语句内部使用“?”占位,然后在外部将通配符“%”与关键词拼接好,再将整个字符串作为参数传入。
听起来有点抽象?看下面的例子就一目了然了:
open普通查询
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)
table动态
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)
总的来说,敏感词过滤提供了第一层快速防御,而参数化查询则是从根源上杜绝SQL注入的“银弹”。对于遗留的ASP项目进行安全加固,将这两种方法结合使用,能显著提升应用程序的安全性。希望以上的实例详解,能为你提供清晰、可操作的改造路径。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Notepad++批量修改文件后缀名脚本使用教程
Notepad++无法直接批量修改文件后缀,通常需借助插件调用系统命令实现。对于简单情况,可使用NppExec插件配合cmd命令处理;若涉及多层目录或复杂条件,则建议编写Python脚本进行递归操作。需注意文件占用可能导致失败,且修改后缀可能影响系统关联和编辑器识别。
Linux下Rust代码编译问题排查与解决指南
在Linux中,如果Rust编译出错,你可以按照以下步骤进行排查和解决: 阅读错误信息: Rust编译器给出的错误信息通常非常详实,不仅会标明错误类型,还会精确到文件和行号。第一步,务必静下心来仔细读一读这些提示,它们往往能直接帮你定位到问题的根源。 检查代码语法: Rust的语法规则相对严谨,有时
Ubuntu系统JSP代码优化方法与实战技巧
Ubuntu上JSP代码与运行时一体化优化指南 想让老派的JSP应用在Ubuntu上跑得又快又稳?这事儿不单是写写代码就行,得从代码、配置到运行时整个链路都做通盘考虑。下面这份优化指南,就是给这类项目开的一剂综合药方。 一 代码与页面层优化 这一层的核心思路是“各司其职”,让前端页面和后端逻辑都回归
Docker与常见技术栈集成方法及实践指南
Linux Docker 的常见集成方式 玩转Docker容器,如果只是单打独斗,那可有点小瞧它了。它真正的潜力,往往在于与生态中其他“伙伴”的紧密协作。通过灵活的集成,它能迸发出远超单个工具的能量。下面这几种常见的组合拳,或许能帮你打开新思路。 1 Kubernetes:不只是编排,更是自动化管
Linux vsFTP性能评测与主流FTP服务器软件对比分析
Linux vsftpd 性能对比与选型建议 结论与定位 当我们谈论面向高并发、长时间稳定运行的生产级FTP服务时,一个名字总是绕不开:vsftpd。在相同的硬件与网络舞台上,这款服务器以其极致的轻量与稳定,展现了令人印象深刻的实力。社区的多项测试与资料显示,它在单机(非集群)部署下就能轻松撑起40
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

