Я пытаюсь передать строку 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-запросов.





Если вы URLEncode строку перед добавлением ее в URL-адрес, у вас не возникнет ни одной из этих проблем (автоматический URLDecode вернет ее в исходное состояние).
Я ни в коем случае не разработчик C#, но похоже, что вам нужно URL-КОДИРОВАТЬ вашу строку Base64, прежде чем отправлять ее в качестве URL-адреса.
У него нет контроля над URL - см. Его вопрос.
Разве вы не можете просто предположить, что пробел - это +, и заменить его?
Request.QueryString["VLTrap"].Replace(" ", "+");
;)
Что ж, очевидно, вы должны закодировать строку Base64 URLEncoded перед ее отправкой на сервер. Если вы не можете этого сделать, я бы предложил просто заменить все встроенные пробелы обратно на +; поскольку строки b64 не должны иметь пробелов, это законная тактика ...
«Ну, очевидно, вам следует закодировать строку Base64 URLEncoded перед ее отправкой на сервер» ... он сказал, что не может этого контролировать.
Отсюда очевидно ... и альтернатива потом.
Вы можете вручную заменить значение (argument.Replace(' ', '+')) или проконсультироваться с HttpRequest.ServerVariables["QUERY_STRING"] (еще лучше HttpRequest.Url.Query) и проанализировать его самостоятельно.
Однако вам следует попытаться решить проблему, в которой указан URL-адрес; знак плюса в URL-адресе должен быть закодирован как "% 2B", поскольку в противном случае плюс представляет собой пробел.
Если вы не контролируете входящие URL-адреса, предпочтительнее будет первый вариант, поскольку таким образом вы избегаете большинства ошибок.
Самый простой способ сделать это - использовать Uri.EscapeDataString / Uri.UnescapeDataString.
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.
У меня была аналогичная проблема с параметром, содержащим значение 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
Хорошо, теперь я совершенно не понимаю, как работает SO. В вопросе явно указано, что нет способа изменить то, что передается в QueryString, но все правильные ответы (т. Е. Заменить пробел на плюс перед декодированием base64) были отклонены. Иди разбери ...