Ошибка QueryString после URLDecode
Я пытаюсь передать строку Base64 в веб-приложение С#.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, но браузер не будет автоматически кодировать GET-запросы.
Ответы
Ответ 1
Вы можете вручную заменить значение (argument.Replace(' ', '+')
) или обратиться к HttpRequest.ServerVariables["QUERY_STRING"]
(еще лучше HttpRequest.Url.Query) и проанализировать его самостоятельно.
Однако вы должны попытаться решить проблему, в которой указан URL-адрес; знак плюса должен быть закодирован как "%2B" в URL, потому что плюс в противном случае представляет собой пробел.
Если вы не контролируете входящие URL-адреса, первый вариант будет предпочтительнее, так как вы избегаете большинства ошибок таким образом.
Ответ 2
Предлагаемое решение:
Request.QueryString["VLTrap"].Replace(" ", "+");
Должно работать нормально. Что касается вашей озабоченности:
У меня было хотя бы это, но я беспокоился об этом, и я должен был упомянуть об этом, чтобы начать, это то, что я не знаю, какие другие символы могут быть искажены в дополнение к знаку плюса.
Это легко облегчить чтение о base64. Единственными невалютно-цифровыми символами, которые являются законными в современной базе64, являются "/", "+" и "=" (которые используются только для заполнения).
Из них "+" - единственное, что имеет особое значение как экранированное представление в URL-адресах. В то время как другие два имеют особое значение в URL-адресах (разделитель путей и разделитель строки запроса), они не должны создавать проблемы.
Итак, я думаю, вы должны быть в порядке.
Ответ 3
У меня такая же проблема, за исключением того, что у меня есть контроль над моим 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(" ", "+");
Затем он работает правильно. Действительно нечетно.
Ответ 4
У меня была аналогичная проблема с параметром, который содержит значение Base64, и когда он поставляется с '+'.
Только Request.QueryString [ "VLTrap" ]. Заменить ( "," +"); отлично работал у меня;
нет UrlEncode или другого кодирования, потому что, даже если вы показываете кодированную ссылку на странице самостоятельно с "+", закодированной как "%2B", а затем браузером, который сначала меняет ее на "+", когда она отображается, и когда вы нажимаете на нее, изменения браузера это пустое пространство. Поэтому нет никакого способа контролировать это, поскольку оригинальный плакат говорит, даже если вы показываете ссылки сами. То же самое с такими ссылками даже в html-письмах.
Ответ 5
Если вы URLEncode строку перед добавлением ее в URL-адрес, у вас не будет никаких из этих проблем (автоматический URLDecode вернет его в исходное состояние).
Ответ 6
Ну, очевидно, вы должны иметь строку Base64 URLEncoded перед отправкой на сервер.
Если вы не можете этого сделать, я бы предложил просто заменить любые встроенные пространства на +; поскольку строки b64 не допускаются к пробелам, их законная тактика...
Ответ 7
System.Web.HttpUtility.UrlEncode(yourString)
выполнит трюк.
Ответ 8
В качестве быстрого взлома вы можете заменить пробел символом плюс до base64-декодирования.
Ответ 9
Если вы используете 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
Ответ 10
Я никоим образом не разработчик С#, но похоже, что вам нужно указать ENCODE для своей базы Base64, прежде чем отправлять его в качестве URL-адреса.
Ответ 11
Разве вы не можете просто предположить, что пробел есть + и заменить его?
Request.QueryString["VLTrap"].Replace(" ", "+");
;)