URL-адрес с двойным кодированием полностью декодируется в ASP.NET

Я только что наткнулся на что-то довольно странное, и все же я не нашел в Интернете упоминаний о других, имеющих ту же проблему.

Если я попаду в свое приложение ASP.NET с двойным закодированным URL-адресом, то Request["myQueryParam"] выполнит для меня двойное декодирование запроса. Это нежелательно, так как я дважды закодировал строку запроса по уважительной причине.

Могут ли другие подтвердить, что я не делаю что-то явно неправильное, и почему это может произойти. Решение для предотвращения этого, без какого-либо неприятного синтаксического анализа строки запроса, тоже было бы здорово!

Например, если вы нажмете URL-адрес: http://localhost/MyApp?originalUrl=http%3a%2f%2flocalhost%2fAction%2fRedirect%3fUrl%3d%252fsomeUrl%253futm_medium%253dabc%2526utm_source%253dabc%2526utm_campaign%253dabc

(Для справки %25 — это символ %)

Затем посмотрите на Request["originalUrl"] (страницу или контроллер), возвращенная строка:

http://localhost/Action/Redirect?Url=/someUrl?utm_medium=abc&utm_source=abc&utm_campaign=abc

я бы ожидал:

http://localhost/Action/Redirect?Url=%2fsomeUrl%3futm_medium%3dabc%26utm_source%3dabc%26utm_campaign%3dabc

Я также проверил в Fiddler, и URL-адрес правильно передается на сервер (одним из возможных виновников может быть браузер, декодирующий URL-адрес перед отправкой).


person Brad R    schedule 23.03.2010    source источник


Ответы (2)


Расслабьтесь, обработка закодированных параметров HttpRequest не нарушена.

Фактически, как гиперссылка, так и прямая навигация из адресной строки приводят к вашему «ожидаемому» результату в запросе.

<a href="WebForm1.aspx?originalUrl=http%3a%2f%2flocalhost%2fAction%2fRedirect%3fUrl%3d%252fsomeUrl%253futm_medium%253dabc%2526utm_source%253dabc%2526utm_campaign%253dabc">HEY</a>

и

WebForm1.aspx?originalUrl=http%3a%2f%2flocalhost%2fAction%2fRedirect%3fUrl%3d%252fsomeUrl%253futm_medium%253dabc%2526utm_source%253dabc%2526utm_campaign%253dabc

результат: http://localhost/Action/Redirect?Url=%2fsomeUrl%3futm_medium%3dabc%26utm_source%3dabc%26utm_campaign%3dabc

Вы должны заранее что-то сделать с URL-адресом, например перенаправить или заполнить свойство NavigateUrl элемента управления asp.net и позволить asp.net отобразить его, который может выполнять первое декодирование до того, как он попадет на целевую страницу.

person Sky Sanders    schedule 23.03.2010
comment
Аааа, ура, кажется, это связано с нашей платформой — вполне возможно, с нашим переписчиком URL. Я позабочусь о том, чтобы в следующий раз сначала протестировать пустой проект! - person Brad R; 24.03.2010
comment
Да, это был наш переписчик URL-адресов — мы обращались к свойству QueryString запроса, а затем добавляли его к переписанному URL-адресу без повторного кодирования. Спасибо за наводку, как только я это сделал, мне не потребовалось много времени, чтобы сузить круг. - person Brad R; 24.03.2010
comment
Можно поподробней, как ты это исправил? Я думаю, что у меня такая же проблема. - person jackvsworld; 12.09.2014

Я думаю, это связано с вашим браузером.

Глядя на Документ безопасности браузера Google, следующие браузеры переводят незарезервированные %nn последовательности в адресной строке: MSIE7, MSIE8, FF3, Opera, Chrome.

В каких браузерах вы тестировали этот результат?

person Jim Schubert    schedule 23.03.2010
comment
Я думал так же, поэтому запустил Fiddler и убедился, что браузер действительно отправляет правильный URL-адрес на сервер (проверено в FF3). - person Brad R; 24.03.2010