
ASP编程入门:从搭建环境到编写第一个网页
ASP 是微软早期的服务器端网页技术。这里所说的 ASP,通常指经典 ASP(Classic ASP,也称 ASP 3.0),而不是后来的 ASP.NET。它常见于使用 Windows Server、IIS、VBScript 和 ADO 的旧系统中。读懂并维护这类项目,至今仍是一些开发者的实际工作;如果要从零开发新系统,则应先评估是否有必要采用经典 ASP,因为它的生态和维护资源都比较有限。
本文从运行环境开始,逐步完成一个可运行的表单页面,并介绍代码边界、输入输出处理、数据库参数化查询和常见故障。示例使用 VBScript,页面保存为 .asp 文件,在 IIS 中运行。
一、经典 ASP 是什么,适合做什么
经典 ASP 是运行在 IIS 上的服务器端脚本环境。浏览器请求 .asp 页面后,IIS 执行页面中的服务器端代码,再把生成的 HTML 响应给浏览器。浏览器看不到服务器端 VBScript 的源代码,只会收到处理后的内容。页面可将 HTML 与 ASP 代码混写,服务器代码通常写在 <% 和 %> 之间。
典型用途包括:
- 维护已有的内部管理系统、企业门户或内容网站。
- 排查旧项目的表单处理、数据库访问和页面渲染问题。
- 在已有 IIS 与 Windows Server 环境中,以较小改动延续旧应用。
它并不等同于 ASP.NET,也不能直接使用 ASP.NET 的控制器、Razor 页面或现代 .NET API。经典 ASP 的脚本运行时、组件和部署方式都不同。若正在设计新系统,应结合团队技术栈、支持周期、部署要求和安全维护能力评估;不要因为文件扩展名相同,就认为 ASP 与 ASP.NET 可以互换。
二、准备运行环境
经典 ASP 依赖 Windows 上的 IIS。开发时可以使用 Windows 客户端的 IIS,也可以部署到安装了 IIS 的 Windows Server。系统版本、IIS 管理界面和可选功能名称可能有所差异;核心要求是安装并启用 IIS 的 ASP 功能,而不只是安装静态网页服务器功能。
在 Windows 客户端启用 IIS 和 ASP
- 打开“启用或关闭 Windows 功能”。
- 启用“Internet Information Services(Internet 信息服务)”。
- 在“万维网服务”下找到“应用程序开发功能”,启用“ASP”。如项目需要,也按实际情况启用其他功能。
- 确认后等待 Windows 安装组件。不同 Windows 版本的界面文字可能略有不同。
- 打开浏览器访问
http://localhost/,检查 IIS 是否正常响应。
也可以通过“Internet Information Services (IIS) 管理器”管理站点。实际服务器上应只安装项目需要的功能,并按组织的补丁和访问控制策略维护系统。经典 ASP 应用的安全性不由“启用 ASP”自动保证。
创建并运行第一个页面
- 在 IIS 管理器中创建一个网站,或使用默认网站进行本地测试。
- 将站点物理路径指向一个目录,例如
C:\inetpub\wwwroot\asp-demo。确保 IIS 工作进程对项目所需文件具有适当权限。 - 在该目录中新建
hello.asp,写入后文的示例代码。 - 通过
http://localhost/asp-demo/hello.asp访问。不要直接双击文件,也不要用只会提供静态文件的方式打开它;那样不会执行 ASP 脚本。
如果页面显示 VBScript 源码、下载文件或出现服务器错误,应先检查请求是否经过 IIS、ASP 功能是否启用、文件扩展名是否正确,以及站点的 ASP 脚本映射和错误日志。生产环境不要向普通访客展示详细服务器错误信息。
三、第一个可运行的 ASP 网页
新建 hello.asp,保存为适合项目的文本编码。旧项目常见本地代码页与 UTF-8 混用的问题,应该让文件编码、页面响应字符集和数据库字符集保持一致。下面的示例声明了 UTF-8 响应,并使用服务器日期时间生成内容:
<%@ Language="VBScript" CodePage="65001" %>
<%
Option Explicit
Response.CodePage = 65001
Response.Charset = "utf-8"
%>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>我的第一个 ASP 页面</title>
</head>
<body>
<h1>你好,经典 ASP</h1>
<p>服务器时间:<%= Server.HTMLEncode(CStr(Now())) %></p>
</body>
</html>
其中,<%@ Language="VBScript" %> 指定脚本语言;Option Explicit 要求变量先声明,能帮助发现拼写错误;<%= ... %> 是输出表达式的简写。它本身不会自动对内容进行安全编码,所以示例显式调用了 Server.HTMLEncode。
Response.CodePage、Response.Charset 和文件实际编码要配套使用。若旧站点采用其他字符集,不要只复制示例中的 UTF-8 设置而忽略现有数据;否则可能出现中文乱码。修改前应先确认项目编码约定,并用实际浏览器和数据进行验证。
四、VBScript 的基本写法
经典 ASP 常用 VBScript。VBScript 的变量不需要在声明时指定静态类型,但可用 Dim 声明变量。语句通常按行书写;续行可使用空格加下划线。以下示例可以放在一个 .asp 页面中运行:
<%
Option Explicit
Dim userName
Dim visitCount
userName = "Lin"
visitCount = 3
If visitCount > 0 Then
Response.Write "欢迎,"
Response.Write Server.HTMLEncode(userName)
Else
Response.Write "暂无访问记录"
End If
%>
常用结构包括 If...Then...Else 条件判断、For...Next 循环和过程(Sub、Function)。例如:
<%
Dim i
For i = 1 To 3
Response.Write "第 " & CStr(i) & " 次<br>"
Next
%>
VBScript 中 & 用于字符串连接。变量未声明、括号与引号不配对、服务器端代码误写在脚本标记之外,都是初学者常遇到的错误。输出 HTML 时要分清“字符串内容”和“HTML 标记”:示例里的 <br> 是输出的 HTML,若它来自用户输入,则不能未经编码就当成标记写入页面。
五、用表单接收用户输入
表单通过 HTTP 请求把数据发送到服务器。GET 参数可通过 Request.QueryString 读取,POST 表单字段可通过 Request.Form 读取。下面的页面既显示表单,也处理提交;将代码保存为 greeting.asp 即可在 IIS 中测试。
<%@ Language="VBScript" CodePage="65001" %>
<%
Option Explicit
Response.CodePage = 65001
Response.Charset = "utf-8"
Dim userName
Dim message
Dim hasError
userName = ""
message = ""
hasError = False
If UCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" Then
userName = Trim(Request.Form("userName"))
If Len(userName) = 0 Then
message = "请输入姓名。"
hasError = True
ElseIf Len(userName) > 40 Then
message = "姓名不能超过 40 个字符。"
hasError = True
End If
End If
%>
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>问候页面</title>
</head>
<body>
<h1>问候页面</h1>
<form method="post" action="greeting.asp">
<label for="userName">姓名:</label>
<input id="userName" name="userName" type="text" maxlength="40"
value="<%= Server.HTMLEncode(userName) %>">
<button type="submit">提交</button>
</form>
<% If hasError Then %>
<p><%= Server.HTMLEncode(message) %></p>
<% ElseIf UCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" Then %>
<p>你好,<%= Server.HTMLEncode(userName) %>!</p>
<% End If %>
</body>
</html>
代码从 Request.Form 取值后,去掉首尾空白,再检查是否为空和长度是否符合业务要求。表单的 maxlength 有助于改善输入体验,但它只在浏览器端生效,客户端限制可以被绕过,所以服务器端仍要验证。示例在重新填入文本框和生成问候语时都调用了 Server.HTMLEncode,避免将输入内容直接解释成 HTML。
长度限制要结合业务定义。VBScript 的 Len 适合做字符串长度检查,但对不同字符如何计数、数据库字段允许的长度以及产品规定的字符数,都应在目标环境中核实。示例中的 40 是业务示例,不是 ASP 或 HTTP 的固定上限。
六、参数边界与请求处理
经典 ASP 没有一条适用于所有项目的“参数长度上限”。请求能否到达页面、请求体和 URL 能有多大,取决于 IIS 版本与配置、请求筛选设置、服务器限制、代理或负载均衡器配置,以及应用自身的处理方式。不要把某个环境中的配置数值当作 ASP 语言规定的通用限制。
实际处理参数时,至少要考虑以下边界:
- 参数可能缺失、为空、重复出现,或包含非预期格式。读取后应按业务规则验证,再进行类型转换;不要默认用户提交的一定是数字、日期或有效标识符。
- URL 中的 GET 参数会出现在地址栏、浏览器历史和部分日志中,不适合放密码、访问令牌等敏感信息。改用 POST 也不等于自动加密,敏感数据传输仍应使用 HTTPS。
- 大型文件上传、复杂 JSON、超长文本等场景需要专门确认 IIS 与应用组件的支持和限制。经典 ASP 并未自动提供现代框架中常见的所有请求解析能力。
- 对列表参数和重复字段,不要假设只会收到一个值。应检查实际请求行为,并明确应用接受单值还是多值。
下面是读取数字参数的简单思路。先判断参数是否符合预期格式,再转换;实际业务还应检查范围、权限和对象是否存在。单纯转成数字并不意味着请求合法。
<%
Dim rawId
Dim recordId
rawId = Trim(Request.QueryString("id"))
If Len(rawId) = 0 Or Not IsNumeric(rawId) Then
Response.Status = "400 Bad Request"
Response.Write "参数格式无效"
Response.End
End If
recordId = CLng(rawId)
If recordId < 1 Then
Response.Status = "400 Bad Request"
Response.Write "参数范围无效"
Response.End
End If
%>
IsNumeric 与 CLng 仍不是完整的输入验证方案:数值格式可能受区域设置影响,转换也可能因超出数据类型范围而失败。对于严格的整数标识符,应明确允许的字符、上下界,并用错误处理妥善覆盖转换失败。生产代码还应将“参数格式错误”和“对象不存在”等情况按应用约定处理,而不是暴露内部异常。
七、数据库访问:使用参数,而不是拼接 SQL
经典 ASP 常通过 ADO(ActiveX Data Objects)访问数据库。数据库连接需要驱动或提供程序、连接字符串和服务器端组件支持。请使用项目环境对应的驱动与受保护的连接配置;不要把真实密码写进公开目录中的页面,也不要假设某个提供程序在所有 Windows 版本上都已安装。
查询中如果包含用户输入,不要直接拼接 SQL 字符串。应使用 ADODB.Command 参数化查询。以下示例展示核心写法,假设已准备好指向相应数据库的连接字符串;连接提供程序、参数类型、SQL 方言和数据库字段类型必须按实际数据库调整。示例常量对应 ADO 常见枚举值,显式写出是为了避免页面没有引用 ADO 类型库时无法识别名称。
<%
Const adCmdText = 1
Const adParamInput = 1
Const adInteger = 3
Const adVarWChar = 202
Dim conn
Dim cmd
Dim rs
Dim searchName
searchName = Trim(Request.Form("searchName"))
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open Application("DbConnectionString")
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT Id, Name FROM People WHERE Name = ?"
cmd.Parameters.Append cmd.CreateParameter( _
"pName", adVarWChar, adParamInput, 40, searchName)
Set rs = cmd.Execute()
Do Until rs.EOF
Response.Write Server.HTMLEncode(CStr(rs("Name"))) & "<br>"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set cmd = Nothing
conn.Close
Set conn = Nothing
%>
这个片段假设数据库字段与参数类型、长度匹配;不同提供程序对占位符和参数顺序的支持细节可能不同,应查阅所用驱动的文档并在目标环境测试。连接字符串应放在受访问控制保护的位置,数据库账号遵循最小权限原则。生产代码还要处理连接或查询失败,并保证连接、记录集等资源在异常路径中也能释放。
参数化查询主要用于让数据值与 SQL 语法分离,从而防止输入被当作 SQL 片段执行;它不能代替授权检查,也不能保护动态拼接的表名、列名或排序方向。若确实需要动态标识符,应从代码中预先定义的允许列表中选择,不能把用户传来的字符串直接拼进 SQL。
八、安全边界:输入验证、输出编码和权限
安全处理不是简单地“过滤危险字符”。同一段字符串放在 HTML 文本、HTML 属性、JavaScript、URL 或 SQL 中,所需处理方式不同。Server.HTMLEncode 适用于编码后输出到一般 HTML 文本或适当处理的 HTML 属性值,不能作为所有上下文的通用编码函数,也不能代替 SQL 参数化、URL 编码或 JavaScript 字符串编码。
实用原则如下:
- 输入验证:按业务规则检查类型、范围、长度和允许值。验证用于确保数据符合业务预期,不应只依赖浏览器端控件。
- 输出编码:将不可信数据放进页面时,按输出上下文采用合适的编码。不要把用户输入直接拼进脚本、样式或 HTML 标记。
- 数据库访问:使用参数化查询处理数据值,限制数据库账号权限,保护连接凭据。
- 权限控制:在服务器端检查用户是否有权查看或修改目标资源。知道一个 URL 或记录编号,不等于有访问权限。
- 错误处理:面向用户返回简洁错误信息,把诊断信息记录到受保护的日志中;不要公开连接字符串、堆栈信息或服务器内部路径。
- 传输保护:使用 HTTPS 保护传输中的凭据和内容。POST 请求本身不提供加密或身份验证。
表单涉及登录状态或改变数据时,还应根据应用架构设计会话保护和防跨站请求伪造措施。经典 ASP 并不会因为使用了 Session 就自动获得完整的 CSRF 防护。不同项目的身份验证方式和部署环境差异较大,应根据实际流程设置可靠的权限检查、请求令牌和 Cookie 安全属性。
九、常见错误与排查顺序
1. 页面下载或显示 ASP 源码
通常是请求没有交给支持经典 ASP 的 IIS 处理,或者服务器未启用 ASP 功能、扩展名映射异常。确认访问的是 IIS 站点地址,而不是本地文件路径或静态文件服务器,并检查 IIS 的应用程序开发功能。
2. 报 VBScript 语法错误
先查看错误行号,再检查变量是否声明、字符串引号是否成对、代码块是否正确结束。复制代码时也要注意 HTML 编辑器可能改写引号或字符。开发环境可启用详细错误信息辅助定位,部署到公网前则应关闭对访客的详细错误展示。
3. 中文乱码
核对 ASP 文件编码、Response.CodePage、Response.Charset、HTML 的 meta charset 和数据库字段编码。只改其中一处不一定能解决问题。旧系统可能有既定代码页,迁移时应先确认数据实际编码,避免错误转换造成内容损坏。
4. 表单内容丢失或一直报错
检查表单控件的 name 是否与读取的字段名一致、方法是否为 POST、表单是否提交到正确页面。浏览器开发者工具可查看请求方法和表单数据。服务器端仍应处理字段缺失及不符合格式的情况。
5. 数据库连接失败
逐项核对提供程序是否安装、连接字符串是否适用、数据库地址和账号权限是否正确,以及 IIS 进程账户是否能访问需要的资源。错误信息不要直接显示给外部用户。部署环境中的位数、驱动版本和本地开发机也可能不同,应在与生产环境接近的环境验证。
6. 页面输出了看似正常但不安全的内容
不要因为页面显示“正确”就认为输出安全。用含有引号、尖括号等字符的测试输入检查页面源码,确认数据不会被解释为意外标记或脚本。数据库查询也要检查是否使用参数,而不是仅依靠替换单引号等手工拼接方式。
十、下一步学习路线
完成第一个页面后,可以按以下顺序继续:熟悉 VBScript 变量、过程和错误处理;了解 Request、Response、Server、Session 与 Application 等内置对象;掌握 ADO 连接、参数化查询与资源释放;再学习 IIS 站点配置、身份验证、日志和安全部署。
开始维护现有系统时,先确认它使用的 IIS 版本、脚本语言、字符集、数据库驱动和认证方式。经典 ASP 页面可能依赖服务器上的 COM 组件、旧版数据库驱动或特定配置,不能只把文件复制到另一台机器就假定能够运行。对旧项目做改动时,优先在测试环境复现、备份数据并记录配置差异。
经典 ASP 的基本执行模型并不复杂:IIS 接收请求、脚本读取并验证输入、应用访问所需资源、服务器生成响应。真正需要谨慎处理的,是运行环境差异、数据边界和安全上下文。掌握这些基础,既能写出一个可运行的 ASP 页面,也能更有条理地维护已有系统。








