13

我搜索了 SO 并发现了类似的问题,但没有一个比较这三个问题。这让我很惊讶,所以如果有人知道,请指出我。

有许多不同的方法可以解析请求的查询字符串......“正确”方式(IMO)应该处理空值/缺失值,但也可以适当地解码参数值。以下哪一项是最好的方法?


方法一

string suffix = Request.QueryString.Get("suffix") ?? "DefaultSuffix";


方法2

string suffix = Request.QueryString["suffix"] ?? "DefaultSuffix";


方法三

NameValueCollection params = HttpUtility.ParseQueryString(Request.RawUrl);    
string suffix = params.Get("suffix") ?? "DefaultSuffix";


方法四

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

  6. 哪些方法可以正确地将“%2b”解码为“+”?


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

4

2 回答 2

6

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

ParseQueryString为您返回与Request.Querystring. 当您有一个原始 URL 并且没有其他方法可以从中解析查询字符串参数时,您通常会使用它。Request.Querystring为您执行此操作,因此在这种情况下,不需要它。

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

  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",因为它会自动解码。

于 2012-01-23T07:28:11.577 回答
2

示例 1:

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

直接回答你的问题:

  1. 不太确定后缀是什么意思,如果您问如果密钥不存在会发生什么(您在 QueryString 中没有它) - 是的,它将返回 null。
  2. 我的猜测是,在构造时,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 或服务器端代码 - 确保将 HttpUtility.UrlEncode 用于后端代码并使用转义用于 JavaScript)。这样浏览器将被迫转向“是我!” 到“It%27s%20me%21”。您可以参考这篇文章了解更多关于 JavaScript 中的 URL 编码的信息:http ://www.javascripter.net/faq/escape.htm 。
  5. 请详细说明,不太明白“如果指定了多个值,将用逗号分隔值”是什么意思。
  6. 据我记得,他们都不会。您可能需要调用 HttpUtility.UrlDecode / HttpUtility.HtmlDecode(根据您的输入)来正确获取字符串,在上面的示例中使用“It's me!” 你会做类似的事情(如果我把它放在编号列表之后,请参阅示例 1,因为代码格式有问题)。
于 2012-01-23T07:53:58.383 回答