Request.QueryString [] и Request.Query.Get () против HttpUtility.ParseQueryString () - PullRequest
12 голосов
/ 23 января 2012

Я искал 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"] возвращать ноль, если не указан суффикс?(Смущающий базовый вопрос, я знаю)

  2. Предоставляет ли * 1034 какие-либо дополнительные функции по сравнению с прямым доступом к 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

Ответы [ 2 ]

6 голосов
/ 23 января 2012

Методы # 1 и # 2 - это одно и то же.(Я думаю, что метод .Get() предусмотрен для совместимости с языками.)

ParseQueryString возвращает вам нечто, что является функциональным эквивалентом Request.Querystring.Обычно вы используете его, когда у вас есть необработанный URL-адрес, и у вас нет другого способа извлечь из него параметры строки запроса.Request.Querystring делает это для вас, поэтому в данном случае это не нужно.

  1. Вы не можете остановиться "suffix".Вы должны либо передать строку или индексный номер.Если вы полностью откажетесь от [], вы получите все NameValueCollection.Если вы имеете в виду, что если "suffix" не было одним из значений QueryString, тогда yes;Вы бы получили 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", потому что оно автоматически декодируется.

2 голосов
/ 23 января 2012

Пример 1:

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

Прямо на ваши вопросы:

  1. Не совсем уверен, что вы подразумеваете под суффиксом, если вы спрашиваете, что происходит, если ключ неприсутствует (у вас его нет в QueryString) - да, он вернет ноль.
  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 для внутреннего кода и escape для JavaScript).Таким образом, браузер будет вынужден включить «Это я!»на "Это% 27s% 20me% 21".Вы можете обратиться к этой статье, чтобы узнать больше о Url-кодировании в JavaScript: http://www.javascripter.net/faq/escape.htm.
  5. Пожалуйста, уточните, что не могу получить то, что вы подразумеваете под "будет разделять запятыми значения, если указано более одного. ".
  6. Насколько я помню, ни один из них не будет.Вам, вероятно, понадобится вызвать HttpUtillity.UrlDecode / HttpUtillity.HtmlDecode (в зависимости от того, какой у вас ввод), чтобы получить строку правильно, в приведенном выше примере с «Это я!»вы будете делать что-то вроде (см. пример 1, как что-то не так с форматированием кода, если я поставлю его после нумерованного списка).
...