ASP request 参数如何获取?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 参数 正文

Request 对象

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

asp request 参数
(图片来源网络,侵删)

主要参数来源与对应的 Request 集合

客户端发送参数最常见的两种方式是:

  1. GET 方法:参数直接附加在 URL 后面,http://example.com/page.asp?id=123&name=test
  2. 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 request 参数
(图片来源网络,侵删)

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 集合。

asp request 参数
(图片来源网络,侵删)

示例 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 对象是获取参数最简单、最常用的方法,它会按照一个固定的顺序来查找参数:

  1. Request.Form (先查找 POST 数据)
  2. 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.QueryStringRequest.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 会将 < 变成 &lt;> 变成 &gt;, 变成 &quot; 等,从而防止脚本执行。


场景 推荐方法 说明
通用、不确定请求方式 Request("paramName") 首选方法,代码简洁,自动处理 GET/POST。
明确知道参数来自 URL Request.QueryString("paramName") 语义更清晰,明确表示你期望从 URL 获取数据。
明确知道参数来自 POST 表单 Request.Form("paramName") 语义更清晰,明确表示你期望从表单体获取数据。
遍历所有参数 Request.QueryString.KeysRequest.Form.Keys 当你不知道参数名称时使用。
安全性 参数化查询Server.HTMLEncode 必须!永远不要信任用户输入,并对输出进行编码。
-- 展开阅读全文 --
头像
Dell灵越15 5567拆机步骤是怎样的?
« 上一篇 今天
JDBC连接Oracle,参数如何正确配置?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]