Двойное / неполное кодирование URL-адреса параметра

В моем веб-приложении мои параметры могут содержать всевозможные сумасшедшие символы (русские символы, косые черты, пробелы и т. д.) И поэтому не всегда могут быть представлены в URL как есть. Отправка их в путь сработает примерно в 50% случаев. Некоторые вещи, такие как пробелы, уже где-то закодированы (я предполагаю, что это делает Html.BuildUrlFromExpression). Однако другие вещи (например, «/» и «*») - нет.

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

Я сделал вручную .replace () символы, с которыми у меня были проблемы. Конечно, это плохая идея.

Идеи?

--Редактировать--
Я знаю, что в моем распоряжении множество библиотек кодирования / декодирования. Похоже, что фреймворк mvc уже пытается сделать это за меня, но не полностью.

<a href = "<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title = "my hat's awesome!">

окажет мне

<a href = "/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title = "my hat's awesome!">

Обратите внимание, что косая черта, звездочка и амперсанд не экранируются. Почему одни сбежали, а другие нет? Как мне теперь правильно избежать этого?

Я что-то не так делаю или это фреймворк?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
6 878
8

Ответы 8

Вы пробовали использовать метод Server.UrlEncode() для кодирования и метод Server.UrlDecode() для декодирования?

У меня не было проблем с его использованием для передачи предметов.

Спасибо за ваш отзыв. Пожалуйста, посмотрите мой исходный пост, чтобы увидеть внесенные мной изменения. Думаю, мой вопрос был недостаточно ясным.

Boris Callens 27.10.2008 19:05

Server.URLEncode или HttpServerUtility.UrlEncode

Я понимаю, о чем вы сейчас говорите - я не понимал, что вопрос был конкретно для MVC. Похоже на ограничение этой части платформы MVC - в частности, BuildUrlFromExpression выполняет некоторую кодировку URL-адресов, но знает, что также требует некоторых из этих знаков препинания как части URL-адресов платформы.

И, к сожалению, URLEncoding не создает инвариант, т.е.

URLEncode(x) != URLEncode(URLEncode(x))

Было бы неплохо. Тогда вы можете предварительно закодировать свои переменные, и они не будут дважды закодированы.

Вероятно, для этого есть лучшая практика платформы ASP.NET MVC. Я думаю, вы могли бы еще кое-что сделать, это закодировать в base64 или что-то, что инвариантно для URLEncode.

Как ни странно, UrlEncode не использует этот w3schools.com/TAGS/ref_urlencode.asp. Например, пробел кодируется как% 25.

Boris Callens 27.10.2008 18:23

На самом деле это моя проблема. Спасибо, что снова прошли мимо.

Boris Callens 28.10.2008 16:36

Параметры должны быть экранированы с помощью Uri.EscapeDataString:

            string url = string.Format("http://www.foo.bar/page?name = {0}&address = {1}",
                Uri.EscapeDataString("adlknad /?? lkm#"),
                Uri.EscapeDataString(" qeio103 8182"));

            Console.WriteLine(url);
            Uri uri = new Uri(url);
            string[] options = uri.Query.Split('?','&');
            foreach (string option in options)
            {
                string[] parts = option.Split('=');
                if (parts.Length == 2)
                {
                    Console.WriteLine("{0} = {1}",parts[0],
                        Uri.UnescapeDataString(parts[1]));
                }
            }

Спасибо за отзыв, но обратите внимание на тег asp.net-mvc. Я отредактировал свой вопрос, чтобы прояснить ситуацию.

Boris Callens 27.10.2008 19:04

Попробуйте использовать Библиотека скриптов Microsoft Anti-Cross Site Scripting. Он содержит несколько методов Encode, которые кодируют все символы (включая # и символы других языков). Что касается декодирования, браузер должен нормально обрабатывать закодированный URL-адрес, однако, если вам нужно вручную декодировать URL-адрес, используйте Uri.UnescapeDataString

Надеюсь, это поможет.

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

Boris Callens 27.10.2008 19:03

Экранирование косой черты и точек в части пути URL запрещено по соображениям безопасности (хотя это работает в моно).

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

Boris Callens 05.11.2008 18:17

Html.BuildUrlFromExpression должен быть исправлен, тогда он отправит этот восходящий поток в проект MVC ... в качестве альтернативы выполните кодирование строки перед передачей в BuildUrlFromExpression и декодируйте ее, когда она вернется на другую сторону.

Это может быть нелегко исправить, поскольку IIS может заранее обрабатывать декодирование строки URL-адреса ... может потребоваться более продвинутое кодирование / декодирование для символов альтернативного пути в служебных методах и декодирование от вашего имени.

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

MVC Framework кодирует символы, которые, как ей известно, необходимо кодировать, но оставляет те, которые являются допустимыми символами URL (например, &%? * /). Это связано с тем, что это допустимые символы URL-адреса, хотя они являются специальными символами в URL-адресе, которые могут не привести к желаемому результату.

Разве символы с системными символами не станут еще большим поводом для их кодирования? Я не вижу причин, по которым я должен передавать параметр, который уже выполняет (частично) работу, которую должен выполнять фактический метод.

Boris Callens 03.08.2009 13:51

Это не потому, что они используются системой, а потому, что они не являются допустимыми символами в соответствии со спецификацией URL, в которой они закодированы. Однако другие символы, которые определяют значение в URL-адресе, не кодируются, потому что они совершенно допустимы.

Ady 09.09.2009 14:55

Я видел похожие посты по этому поводу. Тоже мне кажется, что это недостаток в MVC. Этой функции было бы более уместно называть "BuildUrlFromEncodedExpression". Что еще хуже, вызываемой функции необходимо декодировать свои входные параметры. Юк.

Если есть какое-либо перекрытие между символами, закодированными BuildUrlFromExpression (), и символами, закодированными вызывающим (который, я думаю, может справедливо кодировать любые не буквенно-цифровые символы для простоты), тогда у вас есть потенциал для неприятных ошибок.

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