Request 对象
Request 对象是 ASP 的核心内置对象之一,它包含了所有当前 HTTP 请求的信息,要获取请求参数,我们主要使用它的 集合。

主要参数来源与对应的 Request 集合
客户端发送参数最常见的两种方式是:
- GET 方法:参数直接附加在 URL 后面,
http://example.com/page.asp?id=123&name=test。 - POST 方法:参数包含在 HTTP 请求体中,通常通过表单提交。
Request 对象有几个关键的集合来处理这些参数:
| 集合名称 | 描述 | 适用场景 |
|---|---|---|
Request.QueryString |
获取 URL 中查询字符串(? 之后)的参数。 | GET 请求、链接中的参数、表单 method="get"。 |
Request.Form |
获取通过 POST 方法提交的表单数据。 | 表单 method="post"。 |
Request.QueryString |
也可以获取 POST 请求中的参数,但通常不推荐。 | 特殊情况,见下文说明。 |
Request |
Request 对象本身,可以自动判断参数来源(先查 Form,再查 QueryString)。 |
最常用、最简单的方法,推荐首选。 |
使用 Request.QueryString
当参数通过 URL 传递时(GET 请求),使用 Request.QueryString 集合。
示例 URL: http://yourserver.com/showuser.asp?userId=88&username=JohnDoe

ASP 代码 (showuser.asp):
<%
' 获取名为 "userId" 的参数值
Dim userId
userId = Request.QueryString("userId")
' 获取名为 "username" 的参数值
Dim username
username = Request.QueryString("username")
' 在页面上显示这些值
Response.Write("用户ID: " & userId & "<br>")
Response.Write("用户名: " & username)
%>
输出结果:
用户ID: 88
用户名: JohnDoe
注意: 如果参数不存在,Request.QueryString("paramName") 会返回一个空字符串 ,而不是 Null 或报错。
使用 Request.Form
当用户通过一个 method="post" 的表单提交数据时,使用 Request.Form 集合。

示例 HTML 表单 (form.html):
<form action="process.asp" method="post">
姓名: <input type="text" name="fullName"><br>
邮箱: <input type="text" name="email"><br>
<input type="submit" value="提交">
</form>
ASP 处理代码 (process.asp):
<%
' 获取表单中名为 "fullName" 的输入值
Dim fullName
fullName = Request.Form("fullName")
' 获取表单中名为 "email" 的输入值
Dim email
email = Request.Form("email")
' 在页面上显示提交的数据
Response.Write("欢迎, " & fullName & "!<br>")
Response.Write("您的邮箱是: " & email)
%>
使用 Request 对象(推荐的最佳实践)
直接使用 Request 对象是获取参数最简单、最常用的方法,它会按照一个固定的顺序来查找参数:
Request.Form(先查找 POST 数据)Request.QueryString(Form 中没找到,再查找 URL 中的查询字符串)
这意味着,如果你的表单是 method="post",但你又在 URL 中传递了同名参数,Request 会优先使用 POST 提交的值。
示例:
假设 URL 是 http://yourserver.com/process.asp?name=URL_Name,并且你通过 POST 表单提交了一个 name 字段,值为 Form_Name。
ASP 代码:
<%
' Request 会优先获取 POST 提交的值
Dim name
name = Request("name") ' 这里的 name 值将是 "Form_Name"
Response.Write("获取到的 name 是: " & name)
%>
优点:
- 代码简洁: 无需关心请求是 GET 还是 POST,直接用
Request("paramName")即可。 - 灵活性高: 同一套代码可以处理 GET 和 POST 请求。
获取所有参数名称
如果你不知道会有哪些参数名称,或者需要遍历所有参数,可以使用 Request.QueryString 或 Request.Form 的 .Keys 属性。
示例 (showallparams.asp):
假设 URL 是 http://yourserver.com/showallparams.asp?product=book&category=tech&lang=en
<%
' --- 获取所有查询字符串参数 ---
Response.Write("<h2>查询字符串 参数:</h2>")
Dim qsKey
For Each qsKey In Request.QueryString.Keys
Response.Write("参数名: " & qsKey & ", 值: " & Request.QueryString(qsKey) & "<br>")
Next
' --- 如果有 POST 数据,可以这样获取 ---
' Response.Write("<h2>表单 参数:</h2>")
' Dim formKey
' For Each formKey In Request.Form.Keys
' Response.Write("参数名: " & formKey & ", 值: " & Request.Form(formKey) & "<br>")
' Next
%>
输出结果:
<h2>查询字符串 参数:</h2>
参数名: product, 值: book<br>
参数名: category, 值: tech<br>
参数名: lang, 值: en<br>
安全性:防范 SQL 注入和 XSS 攻击
直接将用户输入的参数拼接到 SQL 查询语句或 HTML 中是非常危险的。
SQL 注入
错误示范 (危险!):
Dim userId
userId = Request.QueryString("id")
' 拼接 SQL 语句,极易被注入
sql = "SELECT * FROM Users WHERE UserID = " & userId
攻击者可以在 URL 中输入 http://.../page.asp?id=1 OR 1=1,导致查询出所有用户数据。
正确做法 (使用参数化查询):
Dim userId, conn, cmd, rs
userId = Request.QueryString("id")
' 假设 conn 已经是有效的数据库连接对象
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE UserID = ?" ' 使用问号作为参数占位符
cmd.Parameters.Append cmd.CreateParameter("id", adInteger, adParamInput, , userId) ' 添加参数
Set rs = cmd.Execute
' ... 处理记录集 ...
跨站脚本攻击
错误示范 (危险!):
Dim userInput
userInput = Request.Form("comment")
' 直接输出到 HTML,用户可能输入恶意脚本
Response.Write("<p>您的评论: " & userInput & "</p>")
攻击者可以在评论框中输入 <script>alert('Hacked!')</script>,当其他用户查看时,脚本就会执行。
正确做法 (对输出进行 HTML 编码):
Dim userInput
userInput = Request.Form("comment")
' 使用 Server.HTMLEncode 对特殊字符进行转义
Response.Write("<p>您的评论: " & Server.HTMLEncode(userInput) & "</p>")
Server.HTMLEncode 会将 < 变成 <,> 变成 >, 变成 " 等,从而防止脚本执行。
| 场景 | 推荐方法 | 说明 |
|---|---|---|
| 通用、不确定请求方式 | Request("paramName") |
首选方法,代码简洁,自动处理 GET/POST。 |
| 明确知道参数来自 URL | Request.QueryString("paramName") |
语义更清晰,明确表示你期望从 URL 获取数据。 |
| 明确知道参数来自 POST 表单 | Request.Form("paramName") |
语义更清晰,明确表示你期望从表单体获取数据。 |
| 遍历所有参数 | Request.QueryString.Keys 或 Request.Form.Keys |
当你不知道参数名称时使用。 |
| 安全性 | 参数化查询 和 Server.HTMLEncode |
必须!永远不要信任用户输入,并对输出进行编码。 |
