Вопрос

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

Пример:

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

Производит:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

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

System.Web.HttpUtility.UrlEncode(yourString) 

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Это легко облегчить с помощью читаю о 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(" ", "+");

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

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

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

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

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

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

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

Я ни в коем случае не являюсь разработчиком C #, но, похоже, вам нужно URL-кодировать вашу строку Base64, прежде чем отправлять ее как URL.

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

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

;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top