我有以下代码:
dim key
for each key in Request.Querystring
'do something
key = sanitized_param(key)
next
我对您的问题classic-asp行家来说,classic-asp或asp通常会将变量作为引用(内存)或按值传递吗?试图弄清楚是否我清理了键变量并将其传递回自身,是该循环的“活着”,还是将新值传递给了原始QueryString?
答案 0 :(得分:2)
Request.QueryString
从页面标题中按值检索查询字符串参数。
只有通过Request.QueryString
检索到查询字符串后,您才能对其进行更改,但是由于它是只读的,因此不能直接对Request.QueryString
进行更改(如果可以进行更改,则可以大概使用Response.QueryString
,但这不是有效的响应命令)。
我猜您正在尝试一次性清理所有查询字符串?这不是真的可能,或者确实是必要的。通常,您可以在请求时清理查询字符串:
Response.Write(sanitized_param(Request.QueryString("myQS")))
或者先将查询字符串分配给变量,然后将其清除:
Dim myQS
myQS = Request.QueryString("myQS")
myQS = sanitized_param(myQS)
' or
myQS = sanitized_param(Request.QueryString("myQS"))
将查询字符串分配给变量并进行清理后,您可以随意引用该变量,而不必再次将其传递给清理函数。
此外,您的示例代码没有多大意义。 key
循环中的for each
值仅引用查询字符串的名称,而不引用它们的值。如果Response.QueryString
是有效的ASP命令,则可以执行以下操作:
Response.QueryString(key) = sanitized_param(Request.QueryString(key))
但是再次,这是不可能的。
编辑:此解决方案可能是您要寻找的:
创建一个字典对象,例如将其称为“ QueryString”。遍历所有查询字符串,然后将净化后的版本添加到字典对象。
Dim QueryString : Set QueryString = Server.CreateObject("Scripting.Dictionary")
For Each Item In Request.QueryString
QueryString.Add Item,sanitized_param(Request.QueryString(Item))
next
现在,要检索经过清理的查询字符串版本,只需使用:
QueryString.Item("query_string_name")
或者对于原始的未消毒版本,您仍然可以使用:
Request.QueryString("query_string_name")
就像Request.QueryString
一样,字典对象是宽容的,如果您请求不存在的查询字符串,则不会返回错误。
您还可以创建一个函数来检索经过清理的查询字符串,例如:
Function SanitizedQS(ByVal qsName)
SanitizedQS = sanitized_param(Request.QueryString(qsName))
End Function
而不是使用Request.QueryString("query_string_name")
,而要使用SanitizedQS("query_string_name")
。