Request.QueryString []与Request.Query.Get()vs. HttpUtility.ParseQueryString()

时间:2012-01-23 07:09:32

标签: c# asp.net parameters request request.querystring

我搜索了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. HttpUtility.ParseQueryString()是否提供了直接访问Request.QueryString的任何额外功能?

  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. 如果指定了多个值,则
  6. ParseQueryString()将逗号分隔值... Request.QueryString()也会这样做,或者如果不这样做会发生什么?

    < / LI>
  7. 其中哪些方法会正确解码“%2b”为“+”?


  8. 再次显示我的Windows开发根源......如果我不想对这些事情这么多,我会成为一个更快的开发人员......:P

2 个答案:

答案 0 :(得分:6)

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

ParseQueryString会返回与Request.Querystring功能相同的内容。当您拥有原始URL并且没有其他方法可以从中解析查询字符串参数时,通常会使用它。 Request.Querystring为您做到这一点,所以在这种情况下,不需要它。

  1. 你不能放弃"suffix"。您必须传递字符串或索引号。如果您完全不使用[],则会得到整个NameValueCollection。如果你的意思是"suffix"不是QueryString值之一,那么是;如果您拨打null

  2. ,您将获得Request.QueryString["suffix"]
  3. 没有。您最有可能使用它的时间是您有一个外部URL并想从中解析查询字符串参数。

  4. ParseQueryString 处理它......也没有从Request.QueryString直接提取值。对于ASP.NET,您通常将表单值作为控件的值来处理, 是ASP.NET通常为您处理这些内容的地方。 换句话说:永远不要信任用户输入。无论什么框架为你做什么。

  5. 我不知道(我认为没有)。但是,我认为您正在阅读的内容告诉您ParseQueryString 返回 UTF-8编码的文本 - 无论它是否在进入时都进行了编码。

  6. 再次:ParseQueryString返回与Request.QueryString基本相同的内容。事实上,我认为ParseQueryString在内部用于提供Request.QueryString

  7. 他们会产生等价物;他们都将正确解码提交的值。如果您有网址:http://site.com/page.aspx?id=%20Hello,则请致电Request.QueryString["id"],返回值为" Hello",因为它会自动解码。

答案 1 :(得分:2)

示例1:

string itsMeString = string.IsNullOrEmpty(Request.QueryString["itsMe"]) ? string.Empty :  HttpUtillity.UrlDecode(Request.QueryString["itsMe"]);

直截了当地提出问题:

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