Проблема с параметром в кодировке Base64 в строке запроса

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

<a target="_blank" href="http://localhost:2817/ConfirmRegistration?confirm=Y0tcmGepe7wjH7A1CT1IaA==">
http://localhost:2817/ConfirmRegistration?confirm=Y0tcmGepe7wjH7A1CT1IaA==
</a>

Но Chrome предупреждает об этом сообщении:

Chrome Message

Строка запроса недействительна? Как я могу это решить?

Кстати:
Мое приложение написано на C # и MVC3.


person Mohammad Dayyan    schedule 26.06.2012    source источник
comment
возможный дубликат нестандартного формата веб-адреса   -  person nemesv    schedule 26.06.2012
comment
Возможный дубликат Передача строк в кодировке base64 в URL   -  person pixel    schedule 17.01.2017


Ответы (5)


Вы должны URL-адрес закодировать параметр confirm. Вы получаете ошибку из-за последнего == фрагмента.

Для этого используйте HttpServerUtility.UrlEncode или аналогичные методы фреймворка.

person Marcel N.    schedule 26.06.2012
comment
У меня пользователь Url.Encode, и строка запроса подтверждения изменена на ?confirm=Y0tcmGepe7wjH7A1CT1IaA%3d%3d, но Google снова предупреждает то же сообщение! - person Mohammad Dayyan; 27.06.2012
comment
У меня были проблемы с интерпретацией знаков + как пробелов, поэтому мне пришлось заменить три небезопасных символа base64, см. stackoverflow.com/a / 48441540/236008 - person Lee Gunn; 25.01.2018

Я использовал HttpUtility.UrlEncode, но у меня были проблемы, если строка в кодировке base64 содержала знак «+». Он правильно кодировался как «% 2b», но когда он возвращался из браузера, он интерпретировался как пробел. Итак, вместо этого я использовал два простых метода кодирования / декодирования:

public static string UrlEncodeBase64(string base64Input)
{
    return base64Input.Replace('+', '.').Replace('/', '_').Replace('=', '-');
}

public static string UrlDecodeBase64(string encodedBase64Input)
{
    return encodedBase64Input.Replace('.', '+').Replace('_', '/').Replace('-', '=');
}
person Lee Gunn    schedule 25.01.2018

Вероятно, вам следует кодировать значение параметра URL-адресом, поскольку = сам используется для отделения имени параметра от значения параметра.

person Jesper    schedule 26.06.2012

Вы можете отправить свое значение, заменив два символа + на _ и / на -:

string confirm=confirm.Replace('+', '_').Replace('/', '+');

<a target="_blank" href="http://localhost:2817/ConfirmRegistration?confirm=@confirm">
http://localhost:2817/ConfirmRegistration?confirm=@confirm
</a>

и вы можете получить свои данные на стороне сервера, используя:

if (Request.QueryString["confirm"] != null && Request.QueryString["confirm"].ToString() != "")
{
       string confirm = HttpUtility.HtmlDecode(Request.QueryString["confirm"]).Replace('_', '+').Replace('-', '/');
}
person vicky    schedule 14.04.2015

Если вы используете ядро ​​ASP.net, вы можете использовать WebEncoders.Base64UrlEncode и WebEncoders.Base64UrlDecode

person Nirbhay Jha    schedule 30.09.2020