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";


问题:

  1. 如果没有指定后缀,Request.QueryString["suffix"]会返回null吗?(我知道这是一个令人尴尬的基本问题)

  2. 与直接访问Request.QueryString相比,HttpUtility.ParseQueryString()是否提供了任何额外的功能?

  3. 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()应该被用来处理这个问题,或者因此暴露在安全缺陷中……是哪一个?

  4. ParseQueryString()默认使用UTF8编码。。。是否所有浏览器都默认使用UTF8编码查询字符串?

  5. 如果指定了多个值,ParseQueryString()将用逗号分隔值。。。Request.QueryString()也能做到这一点吗?否则会发生什么?

  6. 以下哪种方法可以正确地将"%2b"解码为"+"?


再次显示我的Windows开发根源。。。如果我不太想知道这些事情,我会成为一个更快的开发人员…:P

Request.QueryString[] vs. Request.Query.Get() vs. HttpUtilit

方法#1和#2实际上是一样的。(我认为.Get()方法是为了语言兼容性而提供的。)

ParseQueryString返回与Request.Querystring功能等价的东西。当你有一个原始URL,并且没有其他方法从中解析查询字符串参数时,你通常会使用它。Request.Querystring会为你做这件事,所以在这种情况下,它是不需要的。

  1. 你不能离开"suffix"。您必须传递一个字符串或一个索引号。如果你完全去掉[],你就得到了整个NameValueCollection。如果你的意思是"suffix"不是QueryString值之一,那么是的;如果你打电话给Request.QueryString["suffix"],你会得到null

  2. 没有。如果您有一个外部URL,并且希望从中解析查询字符串参数,则最有可能使用它

  3. ParseQueryString不会处理它…也不会直接从Request.QueryString中提取值。对于ASP.NET,您通常将表单值作为控件的值来处理,是ASP.NET通常为您"处理"这些事情的地方换句话说:永远不要相信用户输入。无论什么框架在为你做什么。

  4. 我不知道(我想不知道)。然而,我认为您正在阅读的内容是告诉您,ParseQueryString返回UTF-8编码的文本,无论它在输入时是否如此编码。

  5. 同样:ParseQueryString返回的内容与从Request.QueryString得到的内容基本相同。事实上,我认为ParseQueryString是内部用来提供Request.QueryString的。

  6. 他们将生产同等产品;它们都将正确地解码所提交的值。如果您有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"]);

回答您的问题:

  1. 不太确定后缀是什么意思,如果你问如果键不存在(QueryString中没有)会发生什么——是的,它会返回null
  2. 我的GUESS是,在构造时,Request.QueryString在内部调用HttpUtillity.PasseQueryString()方法,并缓存NameValueCollection以进行后续访问。我认为第一个只剩下了,这样你就可以在请求中不存在的字符串上使用它,例如,如果你正在废弃一个网页,并且需要从该网页代码中找到的字符串中获取一些参数。这样,您就不需要构造Uri对象,但如果您确信只需要这样做,则可以仅将查询字符串作为NameValueCollection获取。这是一个疯狂的猜测。)
  3. 这是在页面级别上实现的,所以如果您正在访问QueryString,比如在page_Load事件处理程序中,您有一个有效且安全的字符串(否则ASP.NET将引发异常,并且不会让代码流进入Page_Load,因此您将受到保护,不会在数据库中存储XSS,异常将为:"从客户端检测到一个潜在危险的Request.QueryString值,这与post变量包含XSS的任何跟踪而不是Request的情况相同。异常形式为Request.QueryString.")。如果打开"validateRequest"(默认情况下是这样),情况就是这样。ASP.NET管道早些时候会抛出异常,因此您没有机会将任何XSS内容保存到存储(数据库)中。关闭它意味着你知道自己在做什么,所以你需要自己实现安全性(通过检查其中的内容)
  4. 也许答应是安全的。无论如何,因为在大多数情况下,您将自己生成QueryString(通过JavaScript或服务器端代码-确保后端代码使用HttpUtillity.UrlEncode,JavaScript使用escape)。这样,浏览器将被迫将"是我!"变成"It%27s%20me%21"。有关JavaScript中Url编码的更多信息,请参阅本文:http://www.javascripter.net/faq/escape.htm.
  5. 请详细说明,我不太明白你所说的"如果指定了多个值,就会用逗号分隔值"是什么意思
  6. 据我记忆所及,他们都不会。您可能需要调用HttpUtillity.UrlDecode/HttpUtillity.HtmlDecode(基于您的输入)来正确获取字符串,在上面的示例中,如果使用"It’s me!",您将执行类似的操作(如果我将其放在编号列表后,请参阅示例1,因为代码格式有问题)