QueryString искажен после URLDecode - PullRequest
       33

QueryString искажен после URLDecode

15 голосов
/ 24 сентября 2008

Я пытаюсь передать строку Base64 в веб-приложение C # .Net через QueryString. Когда строка приходит, знак «+» (плюс) заменяется пробелом. Похоже, что автоматический процесс URLDecode делает это. У меня нет контроля над тем, что передается через QueryString. Есть ли способ обработать эту сторону сервера?

Пример:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

Производит:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

Люди предложили URLE кодировать строку запроса:

System.Web.HttpUtility.UrlEncode(yourString) 

Я не могу этого сделать, так как не могу контролировать вызывающую процедуру (которая отлично работает с другими языками).

Было также предложено заменить пробелы знаком плюс:

Request.QueryString["VLTrap"].Replace(" ", "+");

Я думал об этом, но меня это беспокоило, и я должен был упомянуть об этом, чтобы понять, что я не знаю, какие другие символы могут быть искажены в дополнение к знаку плюса.

Моя главная цель - перехватить строку QueryString до ее запуска через декодер.

С этой целью я попытался посмотреть на Request.QueryString.toString (), но он содержал ту же искаженную информацию. Есть ли способ посмотреть на необработанную строку QueryString до того, как будет URLDecoded?

После дальнейшего тестирования кажется, что .Net ожидает, что все поступающее из QuerString будет закодировано в URL, но браузер не будет автоматически кодировать запросы GET в URL.

Ответы [ 11 ]

14 голосов
/ 16 октября 2008

Предлагаемое решение:

Request.QueryString["VLTrap"].Replace(" ", "+");

Должно работать нормально. Что касается вашего беспокойства:

Я думал об этом, но мое беспокойство по этому поводу, и я должен был упомянуть об этом, чтобы начать, заключается в том, что я не знаю, какие другие символы могут быть искажены, кроме знака плюс.

Это легко облегчить, прочитав о base64 . Единственными не алфавитно-цифровыми символами, которые являются допустимыми в современном base64, являются "/", "+" и "=" (который используется только для заполнения).

Из них "+" является единственным, который имеет особое значение как экранированное представление в URL. Хотя два других имеют особое значение в URL (разделитель пути и разделитель строки запроса), они не должны создавать проблем.

Так что я думаю, что вы должны быть в порядке.

11 голосов
/ 24 сентября 2008

Вы можете вручную заменить значение (argument.Replace(' ', '+')) или обратиться к HttpRequest.ServerVariables["QUERY_STRING"] (еще лучше HttpRequest.Url.Query) и проанализировать его самостоятельно.

Однако вы должны попытаться решить проблему с указанием URL; знак плюс должен быть закодирован как "% 2B" в URL, потому что в противном случае плюс представляет пробел.

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

4 голосов
/ 26 января 2011

У меня точно такая же проблема, но я не могу контролировать свой URL. Даже с Server.URLDecode и Server.URLEncode он не преобразует его обратно в знак +, хотя моя строка запроса выглядит следующим образом:

http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d

Когда я выполняю следующее.

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);

все равно не преобразует %2b обратно в знак +. Вместо этого я должен сделать следующее:

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
tokenID = tokenID.Replace(" ", "+");

Тогда все работает правильно. Действительно странно.

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

У меня была похожая проблема с параметром, который содержит значение Base64 и когда он идет с '+'. Only Request.QueryString ["VLTrap"]. Replace ("", "+"); работал нормально для меня; никакой UrlEncode или другая помощь в кодировке, потому что даже если вы сами показываете закодированную ссылку на странице с символом «+», закодированным как «% 2b», то это браузер, который сначала меняет ее на «+», когда она отображается, и когда вы щелкаете по ней, браузер меняется это пустое место. Так что нет никакого способа контролировать это, как говорит оригинальный постер, даже если вы сами показываете ссылки. То же самое с такими ссылками даже в html-письмах.

1 голос
/ 01 апреля 2014

Если вы используете System.Uri.UnescapeDataString(yourString), он будет игнорировать +. Этот метод следует использовать только в тех случаях, как у вас, когда строка была закодирована с использованием какого-либо устаревшего подхода на клиенте или сервере.

Смотрите этот пост в блоге: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx

1 голос
/ 24 сентября 2008

В качестве быстрого взлома вы можете заменить пробел символом плюс перед декодированием base64.

1 голос
/ 24 сентября 2008

System.Web.HttpUtility.UrlEncode(yourString) добьется цели.

1 голос
/ 24 сентября 2008

Что ж, очевидно, вы должны иметь строку Base64, кодированную URLE, перед отправкой на сервер.
Если вы не можете этого сделать, я бы предложил просто заменить любые встроенные пробелы обратно на +; поскольку строки b64 не должны иметь пробелов, это законная тактика ...

1 голос
/ 24 сентября 2008

Если вы URLE закодируете строку перед добавлением ее в URL, у вас не возникнет ни одной из этих проблем (автоматический URLDecode вернет ее в исходное состояние).

0 голосов
/ 24 сентября 2008

Разве вы не можете просто предположить, что пробел + и заменить его?

Request.QueryString["VLTrap"].Replace(" ", "+");

;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...