Request 对象在HTTP请求期间,检索客户端浏览器传递给服务器的值。
语法
Request[.collection|property|method](variable)
集合
ClientCertificate | 存储在发送到 HTTP 请求中客户端证书中的字段值。 |
Cookies | HTTP 请求中被发送的 cookie 的值。 |
Form | HTTP 请求正文中表格元素的值。 |
QueryString | HTTP 中查询字符串中变量的值。 |
ServerVariables | 预定的环境变量的值。 |
注释
如果指定的变量不是上述的五个集合中的一个,Request 对象返回 EMPTY。
可以通过调用 Request(variable) 直接使用所有的变量,而不需要集合的名称。正因为这样,Web 服务器可以按照下面的顺序搜索集合。
- QueryString
- Form
- Cookies
- ClientCertificate
- ServerVariables
如果同名的变量出现在多个集合中,Request 对象返回遇到的第一个实例。
建议在涉及 ServerVariables 集合的成员时使用全名。例如,不用 Request.(AUTH_USER) 而用Request.ServerVariables(AUTH_USER) 。
QueryString 集合检索HTTP查询字符串中变量的值(GET方式提交的参数)。HTTP查询字符串由问号 (?) 后的值指定。
示例
客户端请求
/scripts/directory-lookup.asp?name=fred&age=22
results in the following QUERY_STRING value.
name=fred&age=22.
QueryString 集合将包含 name
和 age
两个成员。例如:
Welcome, <%= Request.QueryString("name") %>. Your age is <%= Request.QueryString("age") %>.
如果使用下面的脚本
The unparsed query string is: <%=Request.QueryString %>将输出
The unparsed query string is: name=fred&age=22
Form 集合包含POST方法发送到服务端的表单(form)中的值。
示例
<FORM ACTION = "/scripts/submit.asp" METHOD = "post"> <P>Your first name: <INPUT NAME = "firstname" SIZE = 48> <P>What is your favorite ice cream flavor: <SELECT NAME = "flavor"> <OPTION>Vanilla <OPTION>Strawberry <OPTION>Chocolate <OPTION>Rocky Road</SELECT> <p><INPUT TYPE = SUBMIT> </FORM>
下列的请求正文可以从该脚本中发送。
firstname=James&flavor=Rocky+Road
可以使用下面的脚本。
Welcome, <%= Request.Form("firstname") %>. Your favorite flavor is <%= Request.Form("flavor") %>.
下面的输出就是结果。
Welcome, James. Your favorite flavor is Rocky Road.
如果使用下面的脚本
The unparsed form data is: <%= Request.Form %>
结果为
The unparsed form data is: firstname=James&flavor=Rocky+Road
Cookies 集合允许用户检索在 HTTP 请求中发送的 cookie 的值。
注释
可以通过包含一个 key 值来访问 cookie 字典的子关键字。如果访问 cookie 字典时未指定 key,则所有关键字都会作为单个查询字符串返回。例如,如果 MyCookie
有两个关键字, First
和 Second
,而在调用 Request.Cookies时并未指定其中任何一个关键字,那么将返回下列字符串。
First=firstkeyvalue&Second=secondkeyvalue
如果客户端浏览器发送了两个同名的 cookie,那么 Request.Cookie 将返回其中路径结构较深的一个。例如,如果有两个同名的的 cookie,但其中一个的路径属性为 /www/ 而另一个为 /www/home/,客户端浏览器同时将两个 cookie 都发送到 /www/home/ 目录中,那么 Request.Cookie 将只返回第二个 cookie。
编码问题
http://127.0.0.1:8080/1.asp?%50=dd%50&ll=we%50 #%50是P编码
cookies设为:h%50=we%50
<%
response.write Request.QueryString
response.write "<br>"
response.write Request.ServerVariables("QUERY_STRING")
response.write "<br>"
response.write Request("P")&Request("ll")
response.write "<br>"
response.write Request.Cookies
%>
程序输出
%50=dd%50&ll=we%50
%50=dd%50&ll=we%50
ddPweP
hP=weP
<%
response.write Request.Form("tP")
%>
post t%50=dd%50
输出
ddP
<%
response.write Request.Form
%>
post t%50=dd%50
输出
t%50=dd%50
即Request.QueryString和Request.ServerVariables("QUERY_STRING")字符串原样输出,参数名和值编码的字符都不进行转换,而Request("P")和Request.Cookies对编码的参数名和值都进行转换。Request.Form集合同样不转换编码,但Request.Form("参数名")的形式转换编码。
不规则包问题
GET /Downloadshow.asp HTTP/1.1
HOST:XXXXXXXXXXXXXXXX
Content-Length: xx
Content-Type: XXXXXXXXXXXXXXXXXX
ID=111
用nc提交如上的http包时,Request.QueryString和Request.ServerVariables("QUERY_STRING")无法收到ID及值,但Request("ID")可以收到。
总结:Request对象的五个集合、取值顺序、解码方式以及不规则HTTP包为绕过一些防注入程序提供了方法。