Request.QueryString[] vs. Request.Query.Get() vs. HttpUtilit
本文关键字:Request vs HttpUtilit Get Query QueryString | 更新日期: 2023-09-27 18:21:01
我搜索了SO,发现了类似的问题,但没有人比较这三个问题。这让我很惊讶,所以如果有人知道其中一个,请给我指一下。
有许多不同的方法可以解析请求的查询字符串。。。"正确"的方式(IMO)应该处理空值/缺失值,但也要根据情况解码参数值。以下哪一项是同时做到这两项的最佳方法?
方法1
string suffix = Request.QueryString.Get("suffix") ?? "DefaultSuffix";
方法2
string suffix = Request.QueryString["suffix"] ?? "DefaultSuffix";
方法3
NameValueCollection params = HttpUtility.ParseQueryString(Request.RawUrl);
string suffix = params.Get("suffix") ?? "DefaultSuffix";
方法4
NameValueCollection params = HttpUtility.ParseQueryString(Request.RawUrl);
string suffix = params["suffix"] ?? "DefaultSuffix";
问题:
如果没有指定后缀,
Request.QueryString["suffix"]
会返回null吗?(我知道这是一个令人尴尬的基本问题)与直接访问
Request.QueryString
相比,HttpUtility.ParseQueryString()
是否提供了任何额外的功能?MSDN文档列出了此警告:
The ParseQueryString method uses query strings that might contain user input, which is a potential security threat. By default, ASP.NET Web pages validate that user input does not include script or HTML elements. For more information, see Script Exploits Overview.
但我不清楚这是否意味着ParseQueryString()
应该被用来处理这个问题,或者因此暴露在安全缺陷中……是哪一个?ParseQueryString()
默认使用UTF8编码。。。是否所有浏览器都默认使用UTF8编码查询字符串?如果指定了多个值,
ParseQueryString()
将用逗号分隔值。。。Request.QueryString()
也能做到这一点吗?否则会发生什么?以下哪种方法可以正确地将"%2b"解码为"+"?
再次显示我的Windows开发根源。。。如果我不太想知道这些事情,我会成为一个更快的开发人员…:P
方法#1和#2实际上是一样的。(我认为.Get()
方法是为了语言兼容性而提供的。)
ParseQueryString
返回与Request.Querystring
功能等价的东西。当你有一个原始URL,并且没有其他方法从中解析查询字符串参数时,你通常会使用它。Request.Querystring
会为你做这件事,所以在这种情况下,它是不需要的。
-
你不能离开
"suffix"
。您必须传递一个字符串或一个索引号。如果你完全去掉[]
,你就得到了整个NameValueCollection
。如果你的意思是"suffix"
不是QueryString值之一,那么是的;如果你打电话给Request.QueryString["suffix"]
,你会得到null
。 -
没有。如果您有一个外部URL,并且希望从中解析查询字符串参数,则最有可能使用它
-
ParseQueryString
不会处理它…也不会直接从Request.QueryString
中提取值。对于ASP.NET,您通常将表单值作为控件的值来处理,是ASP.NET通常为您"处理"这些事情的地方换句话说:永远不要相信用户输入。无论什么框架在为你做什么。 -
我不知道(我想不知道)。然而,我认为您正在阅读的内容是告诉您,
ParseQueryString
是返回UTF-8编码的文本,无论它在输入时是否如此编码。 -
同样:
ParseQueryString
返回的内容与从Request.QueryString
得到的内容基本相同。事实上,我认为ParseQueryString
是内部用来提供Request.QueryString
的。 -
他们将生产同等产品;它们都将正确地解码所提交的值。如果您有URL:
http://site.com/page.aspx?id=%20Hello
,那么调用Request.QueryString["id"]
,返回值将是" Hello"
,因为它会自动解码。
示例1:
string itsMeString = string.IsNullOrEmpty(Request.QueryString["itsMe"]) ? string.Empty : HttpUtillity.UrlDecode(Request.QueryString["itsMe"]);
回答您的问题:
- 不太确定后缀是什么意思,如果你问如果键不存在(QueryString中没有)会发生什么——是的,它会返回null
- 我的GUESS是,在构造时,Request.QueryString在内部调用HttpUtillity.PasseQueryString()方法,并缓存NameValueCollection以进行后续访问。我认为第一个只剩下了,这样你就可以在请求中不存在的字符串上使用它,例如,如果你正在废弃一个网页,并且需要从该网页代码中找到的字符串中获取一些参数。这样,您就不需要构造Uri对象,但如果您确信只需要这样做,则可以仅将查询字符串作为NameValueCollection获取。这是一个疯狂的猜测。)
- 这是在页面级别上实现的,所以如果您正在访问QueryString,比如在page_Load事件处理程序中,您有一个有效且安全的字符串(否则ASP.NET将引发异常,并且不会让代码流进入Page_Load,因此您将受到保护,不会在数据库中存储XSS,异常将为:"从客户端检测到一个潜在危险的Request.QueryString值,这与post变量包含XSS的任何跟踪而不是Request的情况相同。异常形式为Request.QueryString.")。如果打开"validateRequest"(默认情况下是这样),情况就是这样。ASP.NET管道早些时候会抛出异常,因此您没有机会将任何XSS内容保存到存储(数据库)中。关闭它意味着你知道自己在做什么,所以你需要自己实现安全性(通过检查其中的内容)
- 也许答应是安全的。无论如何,因为在大多数情况下,您将自己生成QueryString(通过JavaScript或服务器端代码-确保后端代码使用HttpUtillity.UrlEncode,JavaScript使用escape)。这样,浏览器将被迫将"是我!"变成"It%27s%20me%21"。有关JavaScript中Url编码的更多信息,请参阅本文:http://www.javascripter.net/faq/escape.htm.
- 请详细说明,我不太明白你所说的"如果指定了多个值,就会用逗号分隔值"是什么意思
- 据我记忆所及,他们都不会。您可能需要调用HttpUtillity.UrlDecode/HttpUtillity.HtmlDecode(基于您的输入)来正确获取字符串,在上面的示例中,如果使用"It’s me!",您将执行类似的操作(如果我将其放在编号列表后,请参阅示例1,因为代码格式有问题)