Как использовать странные символы в строке запроса - PullRequest
1 голос
/ 14 апреля 2010

Я использую Silverlight / ASP .NET и C #. Что, если я хочу сделать это, например, из Silverlight,

// I have left out the quotes to show you literally what the characters
// are that I want to use
string password = vtakyoj#"5
string encodedPassword = HttpUtility.UrlEncode(encryptedPassword, Encoding.UTF8);
// encoded password now = vtakyoj%23%225

URI uri = new URI("http://www.url.com/page.aspx@password=vtakyoj%23%225");

HttpPage.Window.Navigate(uri);

Если я отлаживаю и смотрю на значение uri, оно выглядит следующим образом (мы все еще в приложении silverlight),

http://www.url.com?password=vtakyoj%23"5

Так что% 22 по какой-то причине стал цитатой.

Если я затем отлаживаюсь внутри кода page.aspx (который, конечно, является ASP .NET), значение Request ["password"] на самом деле будет следующим:

vtakyoj#"5

Что является исходным значением. Как это работает? Я бы подумал, что мне придется идти,

HttpUtility.UrlDecode(Request["password"], Encoding.UTF8)

Для получения исходного значения.

Надеюсь, это имеет смысл?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2010

Сначала давайте начнем с бизнеса UTF8. По сути, в этом случае их нет. Если строка содержит символы в стандартном диапазоне символов ASCII (как и ваш пароль), кодировка этой строки в кодировке UTF8 идентична однобайтовой строке ASCII.

Вы начинаете с этого: -

vtakyoj # "5

HttpUtility.UrlEncode несколько агрессивно кодирует его в: -

vtakyoj% 23% 225

Он закодировал # и «однако только #» имеет особое значение в URL. Следовательно, при просмотре строкового значения объекта Uri в Silverlight вы видите: -

vtakyoj% 23" 5

Редактировать (отвечая на дополнительные вопросы)

Откуда оно знает, чтобы его расшифровать?

Все данные в URL должны быть правильно закодированы, что является частью действительного URL. Следовательно, веб-сервер может справедливо предположить, что все данные в строке запроса были соответствующим образом закодированы.

Что если бы у меня была настоящая строка с% 23 в ней?

Правильная кодировка для "% 23" будет "% 3723", где% 37 это%

Это документированная особенность запроса ["Password"], что он его декодирует?

Ну, я не знаю, вы бы проверили документацию, я думаю. Кстати, Request.QueryString["Password"] использование этого же индексатора непосредственно на Request было сделано для удобства переноса классического ASP на .NET. Это не имеет никакого реального значения, но лучше для ясности, поскольку легче провести различие между значениями QueryString и Form.

если я не использую UFT8, символы отфильтровываются.

Вы уверены, что в пароле могут присутствовать символы не ASCII? Можете ли вы привести пример, который в текущем примере не требуется кодировать с помощью UTF-8?

0 голосов
/ 14 апреля 2010

Если Request["password"] должен работать, вам нужно "http://url.com?password=" + HttpUtility.UrlEncode("abc%$^#@"). То есть тебе нужно ? отделить имя хоста.

Также синтаксис @ равен username:password@hostname, но он был отключен в IE7 и выше IIRC.

...