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

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

Пример:

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

Производит:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

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

System.Web.HttpUtility.UrlEncode(yourString) 

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

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

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

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

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

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

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

Хорошо, теперь я совершенно не понимаю, как работает SO. В вопросе явно указано, что нет способа изменить то, что передается в QueryString, но все правильные ответы (т. Е. Заменить пробел на плюс перед декодированием base64) были отклонены. Иди разбери ...

Alexander 24.09.2008 02:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
1
31 892
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

Я ни в коем случае не разработчик C#, но похоже, что вам нужно URL-КОДИРОВАТЬ вашу строку Base64, прежде чем отправлять ее в качестве URL-адреса.

У него нет контроля над URL - см. Его вопрос.

Jason Bunting 24.09.2008 01:36

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

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

;)

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

«Ну, очевидно, вам следует закодировать строку Base64 URLEncoded перед ее отправкой на сервер» ... он сказал, что не может этого контролировать.

Jason Bunting 24.09.2008 01:43

Отсюда очевидно ... и альтернатива потом.

AviD 24.09.2008 03:06
Ответ принят как подходящий

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

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

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

Самый простой способ сделать это - использовать Uri.EscapeDataString / Uri.UnescapeDataString.

Chris Hynes 10.12.2011 00:46

System.Web.HttpUtility.UrlEncode(yourString) сделает свое дело.

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

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

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

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

I had though of this but my concern with it, and I should have mentioned this to start, is that I don't know what other characters might be malformed in addition to the plus sign.

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

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

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

У меня точно такая же проблема, за исключением того, что я могу контролировать свой 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(" ", "+");

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

У меня была точно такая же проблема. Похоже, Request.QueryString["TokenID"] возвращает уже закодированную строку URL. Передавая его в Server.UrlDecode, вы дважды выполняете urldecoding.

graycrow 11.01.2012 23:55

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

Если вы используете 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

Другие вопросы по теме