Двойное / неполное URL-кодирование параметра - PullRequest
7 голосов
/ 27 октября 2008

В моем веб-приложении мои параметры могут содержать всевозможные сумасшедшие символы (русские символы, косые черты, пробелы и т. Д.) И поэтому не всегда могут быть представлены в 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!">

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

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

Ответы [ 8 ]

2 голосов
/ 27 октября 2008

Параметры должны быть экранированы с помощью 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]));
                }
            }
1 голос
/ 23 декабря 2008

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

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

0 голосов
/ 24 декабря 2008

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

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

0 голосов
/ 19 декабря 2008

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

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

0 голосов
/ 03 ноября 2008

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

0 голосов
/ 27 октября 2008

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

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

0 голосов
/ 27 октября 2008

Server.URLEncode или HttpServerUtility.UrlEncode

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

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

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

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

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

0 голосов
/ 27 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...