Escape + (плюс) в URI - PullRequest
       1

Escape + (плюс) в URI

5 голосов
/ 11 августа 2010

Когда пользователь вводит электронное письмо на мой веб-сайт, я отправляю электронное письмо с подтверждением, содержащее ссылку.Ссылка выглядит примерно так:

http://mysite.com/VerifyEmail?email=name@domain.com&token=12341234

Электронная почта данного пользователя содержит «+» (плюс), поэтому ссылка выглядит следующим образом:

http://mysite.com/VerifyEmail?email=foo+bar@domain.com&token=12341234

при нажатии на ссылку (по крайней мере, в Firefox) плюс заменяется пробелом.

Вопрос: Какую функцию кодирования URL я использую в .net для экранирования плюса.

Примечание: Uri.EscapeUriString(email) листья плюс нетронутыми.

Ответы [ 3 ]

12 голосов
/ 11 августа 2010

Вместо этого вы можете использовать Uri.EscapeDataString - я только что убедился, что это превращает "Foo + Bar" в "Foo% 2BBar".

Если честно, я был бы признателен, если бы MS предоставила немного больше советов о разнице между этими методами, а также HttpUtility.UrlEncode (который доступен не на всех платформах).

2 голосов
/ 11 августа 2010

Вы можете попробовать метод UrlEncode :

string encodedEmail = HttpUtility.UrlEncode(email);
0 голосов
/ 11 августа 2010

Лучшее, что вы можете сделать - это зашифровать или зашифровать адрес электронной почты или несколько «включить» его в свой токен.

Таким образом, ваша ссылка может выглядеть так: http://mysite.com/VerifyEmail?token=12341234480348204023

Или: http://mysite.com/VerifyEmail?emailcode=A124E4F325O425FE5F4J6636K66L&token=12341234

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

var emailcode = Convert.ToBase64String(GetHashBytes(email)).Replace('+', '@');

Затем при выполнении подтверждения:

var emailcodebytes = Convert.FromBase64String(Request["code"].Replace('@', '+'));
...