ASP 总结
回顾核心概念、常见陷阱清单、以及向现代技术迁移的路径。
Key PointsASP 的核心是五个内置对象加 VBScript;安全上的关键是「一切输入都不可信」。
你学到了什么
- 语法 ——
Dim、If、For、Sub、Function,以及Option Explicit - 五个对象 ——
Request读、Response写、Session存用户、Application存全站、Server造对象 - 文件 ——
FileSystemObject+TextStream,注意 UTF-8 要用ADODB.Stream - 数据库 ——
Connection/Recordset/Command,参数化防注入 - 组件 ——
AdRotator、BrowserCap、Content Linking、ContentRotator
陷阱清单
| Trap | Consequence |
|---|---|
| 拼 SQL | 注入,可直接拖库 |
| 直接输出参数 | XSS |
Application 不加锁 | 计数丢失、数据错乱 |
| 文件带 BOM | Redirect / Cookies 静默失效 |
输出后才 Redirect | 「HTTP 头已发送」 |
Request("x") 不指定集合 | 参数被 URL 覆盖 |
| 上传目录可执行脚本 | 上传 .asp 即获得执行权限 |
| 错误详情发到浏览器 | 泄露路径与 SQL |
安全检查
ASP
<%
' 1. 所有输出转义
Response.Write Server.HTMLEncode(userInput)
' 2. 所有 SQL 参数化
cmd.Parameters.Append cmd.CreateParameter("p", 200, 1, 100, userInput)
' 3. 所有文件路径校验
If InStr(userInput, "..") = 0 And userInput Like "[A-Za-z0-9_.-]*" Then
' 安全
End If
' 4. 所有重定向目标白名单
If Left(url, 22) = "https://example.com/" Then
Response.Redirect url
End If
%>迁移到现代技术
| From | To | Why |
|---|---|---|
| ASP + VBScript | ASP.NET Core + C# | 同一生态,性能与工具链好得多 |
| ADO | Entity Framework / Dapper | 参数化更自然,不易写错 |
FileSystemObject | System.IO | UTF-8 原生支持,无 COM 开销 |
Application 缓存 | Redis / MemoryCache | 跨进程、跨机器共享 |
Global.asa | Program.cs 启动配置 | 类型安全,可测试 |
Migration is not a rewrite. A common path keeps old pages and builds new features as separate services behind a reverse proxy on /api/*, shifting traffic gradually — every step shippable and reversible.
For an internal tool with a few dozen users, fixing security holes may beat migrating. Audit security first, then refactor — the reverse order often spends effort without solving the real problem.
继续学习
- SQL 与数据库设计 —— 索引、事务、范式,比语言本身更重要
- HTTP 与 Web 安全 —— OWASP Top 10 是必修
- 一门现代服务端语言 —— C#、Node.js 或 Go
- 前端工程化 —— 现代项目里服务端只返回数据
你学到了什么
- 语法 ——
Dim、If、For、Sub、Function,以及Option Explicit - 五个对象 ——
Request读、Response写、Session存用户、Application存全站、Server造对象 - 文件 ——
FileSystemObject+TextStream,注意 UTF-8 要用ADODB.Stream - 数据库 ——
Connection/Recordset/Command,参数化防注入 - 组件 ——
AdRotator、BrowserCap、Content Linking、ContentRotator
陷阱清单
| 陷阱 | 后果 |
|---|---|
| 拼接 SQL | 注入,可直接拖库 |
| 直接输出参数 | XSS |
Application 不加锁 | 计数丢失、数据错乱 |
| 文件带 BOM | Redirect / Cookies 静默失效 |
输出后才 Redirect | 「HTTP 头已发送」 |
Request("x") 不指定集合 | 参数被 URL 覆盖 |
| 上传目录可执行脚本 | 上传 .asp 即获得执行权限 |
| 错误详情发到浏览器 | 泄露路径与 SQL |
安全检查
ASP
<%
' 1. 所有输出转义
Response.Write Server.HTMLEncode(userInput)
' 2. 所有 SQL 参数化
cmd.Parameters.Append cmd.CreateParameter("p", 200, 1, 100, userInput)
' 3. 所有文件路径校验
If InStr(userInput, "..") = 0 And userInput Like "[A-Za-z0-9_.-]*" Then
' 安全
End If
' 4. 所有重定向目标白名单
If Left(url, 22) = "https://example.com/" Then
Response.Redirect url
End If
%>迁移到现代技术
| 原来 | 可以换成 | 理由 |
|---|---|---|
| ASP + VBScript | ASP.NET Core + C# | 同一生态,性能与工具链好得多 |
| ADO | Entity Framework / Dapper | 参数化更自然,不易写错 |
FileSystemObject | System.IO | UTF-8 原生支持,无 COM 开销 |
Application 缓存 | Redis / MemoryCache | 跨进程、跨机器共享 |
Global.asa | Program.cs 启动配置 | 类型安全,可测试 |
迁移不是重写全部。常见做法是保留旧页面,把新功能做成独立服务,用反向代理把 /api/* 转给新服务,逐步把流量搬过去——这样每一步都能上线、能回滚。
如果站点只是内部工具、用户不超过几十人,迁移的收益可能不如把安全漏洞补上。先做安全审计,再谈重构——顺序反了容易花大力气却没解决真正的问题。
继续学习
- SQL 与数据库设计 —— 索引、事务、范式,比语言本身更重要
- HTTP 与 Web 安全 —— OWASP Top 10 是必修
- 一门现代服务端语言 —— C#、Node.js 或 Go
- 前端工程化 —— 现代项目里服务端只返回数据