不知道这个问题有人发现过没有,可以算ASP的一个BUG

wtogether 2008-07-24 05:43:59
当Request.QueryString和Request.Form有同名元素存在,那么当用序列同时遍历QueryString和Form集合时,QueryString集合会遮挡住Form集合的集合数及遮挡住Request.Form集合中的同名元素,测试代码,文件保存为test.asp:

<%@language="vbscript"%>
<form action="test.asp?name=test&intro=test" method="post">
<input type="text" name="name" value="aaa" /><br/>
<textarea name="intro" cols="90" rows="10">bbb</textarea><br/>
<input type="submit" value="GO" />
</form>
<%
Public Sub PrintC(ByVal strType, ByVal obj)
Dim i
For i = 1 To obj.Count
Response.Write strType + ">>" + obj.Key(i) + "=" + obj.Item(i) + "<br/>"
Next
End Sub

If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
Response.Write Request.QueryString.Count & "," & Request.Form.Count & "<br/>" '这里输出集合数QueryString是2,而Form集合数是0
PrintC "QueryString", Request.QueryString '遍历QueryString集合
PrintC "Form", Request.Form '遍历Form集合,但是这里打印不出元素
Response.Write "Form(name) = " + Request.Form("name") + "<br/>" '这里可以打印出来
End If
%>

当不打印QueryString集合数及不遍历Request.QueryString集合时,才可以打印Request.Form集合,否则Request.Form集合数为0,并且Request.Form集合是空,这时,只有用For Each才能遍历集合
...全文
141 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhwcd 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 alianasia 的回复:]
楼主真细心.不过我很少会去同时检测这二个东西.
[/Quote]
之前还真没有试过,学习了。
  • 打赏
  • 举报
回复
JavaScript For...In 声明
For...In 声明用于对数组或者对象的属性进行循环操作。

for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。

语法:
for (变量 in 对象)
{
在此执行代码
}“变量”用来指定变量,指定的变量可以是数组元素,也可以是对象的属性。

实例:
使用 for ... in 循环遍历数组。
<html>
<body>

<script type="text/javascript">
var x
var mycars = new Array()
mycars[0] = "Saab"
mycars[1] = "Volvo"
mycars[2] = "BMW"

for (x in mycars)
{
document.write(mycars[x] + "<br />")
}
</script>

</body>
</html>
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wtogether 的回复:]
偶然发现的,因为JS下没有For Each来遍历QueryString和Form集合,就用序列来遍历,看来现在只有用枚举来遍历了
[/Quote]

JS里可以用FOR IN啊
wtogether 2008-07-24
  • 打赏
  • 举报
回复
偶然发现的,因为JS下没有For Each来遍历QueryString和Form集合,就用序列来遍历,看来现在只有用枚举来遍历了
murphy1005 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 alianasia 的回复:]
楼主真细心.不过我很少会去同时检测这二个东西.
[/Quote]
  • 打赏
  • 举报
回复
刚才测试了一下,不同名的话,存在Request.QueryString.Count,Request.Form.Count不一定等于0

以前就发现这个请情况,只是一直找不到资料看这2个的区别
  • 打赏
  • 举报
回复
就算是不同名,只要存在Request.QueryString.Count,Request.Form.Count都是等于0
  • 打赏
  • 举报
回复
至于为什么Request.Form.Count=0至今我也不是很清楚,看了许多说明文档,也没有说明Request.QueryString.Count会比Request.Form.Count优先
  • 打赏
  • 举报
回复
遮挡住Request.Form集合中的同名元素

所以说你这句话是错误的
  • 打赏
  • 举报
回复
PrintC "Form", Request.Form '遍历Form集合,但是这里打印不出元素

这个地方打印不出东西其实是由于Request.Form.Count=0无法进行循环造成的,但实际上是可以得到值的
可以换成
Function ParamFormat(byVal sName,byVal sData)
ParamFormat=sName& "[ "&Replace(Replace(sData, "= ", "=> ' "), "& ", " '; ")& " ';] "
End Function
Response.Write ParamFormat( "Pst ",Request.Form)&_
ParamFormat( "Get ",Request.QueryString)这样看看是不是有值
Anlige 2008-07-24
  • 打赏
  • 举报
回复
遍历form或querystring的时候都是用foreach~
不过基本没遍历过~呵呵

----------------------------^_^大家一起学习^_^------------------------------
艾恩ASP学习博客 http://blog.ii-home.cn

Email:zhanghuiguoanlige@126.com QQ:417833272
免费提供各种ASP学习资源,组件、源代码、学习手册、技术文章...
ASP无组件上传(支持多文件+表单数据)
ASP无组件上传(保存表单到数据库)
Asp生成IP个性标签
alianasia 2008-07-24
  • 打赏
  • 举报
回复
楼主真细心.不过我很少会去同时检测这二个东西.
  • 打赏
  • 举报
回复
你测试完全没??
不测试完全不要这么轻易下结论
wtogether 2008-07-24
  • 打赏
  • 举报
回复
当然有了,当有人用For i来遍历QueryString和Form集合检测注入代码时,在QueryString中放入同名元素,然后在Request.Form中放入注入代码,那么QueryString和Form中都检测不到,但其实注入代码存在Form中
daniel_jusa 2008-07-24
  • 打赏
  • 举报
回复
我们有什么可趁之机吗?

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧