Как можно избежать недопустимых символов при составлении URL? - PullRequest
8 голосов
/ 28 октября 2008

Я пишу веб-приложение, которое динамически создает URL-адреса на основе некоторого ввода, который будет использоваться клиентом в другое время. Для обсуждения эти URL могут содержать определенные символы, такие как прямая косая черта (т. Е. '/') , которая должна интерпретироваться не как часть фактического URL, а как аргумент. Например:

http://mycompany.com/PartOfUrl1/PartOfUrl2/ArgumentTo/Url/GoesHere

Как видите, ArgumentTo / Url / GoesHere действительно имеет косую черту, но их следует игнорировать или экранировать .

Это может быть плохой пример, но рассматриваемый вопрос носит более общий характер и применяется к другим специальным символам .

Итак, если есть части URL, которые являются просто аргументом s и не должны использоваться для разрешения реального веб-запроса, каков хороший способ обработки этого?

Обновление:

Учитывая некоторые ответы, я понял, что не смог указать несколько фрагментов, которые, надеюсь, помогут прояснить ситуацию.

Я бы хотел сохранить эту независимость от языка, так как было бы здорово, если бы клиент мог просто сделать запрос. Например, если клиент знал, что он хочет передать ArgumentTo / Url / GoesHere , было бы здорово, если бы он мог быть кодирован в уникальную строку в который сервер может развернуть и декодировать , чтобы использовать.

Можно ли предположить, что аналогичные функции, такие как HttpUtility.HtmlEncode / HtmlDecode в .NET Framework, доступны на других системах / платформах? URL-адрес не обязательно должен быть довольно , поэтому наличие в пути настоящих слов не имеет большого значения.

Будет ли работать что-то вроде кодировки base64 аргумента?

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

Ответы [ 5 ]

5 голосов
/ 28 октября 2008

Вы не сказали, какой язык вы используете, но PHP имеет полезную функцию urlencode, а в C # есть HttpUtility.URLEncode и Server.UrlEncode, которые должны хорошо кодировать части вашего URL.

Если вам нужен другой способ , эта страница содержит список закодированных значений. Например: / == %2f.

обновление

Из того, что вы обновили, я бы сказал, что идея Вояджерфана об URLRewriting создала что-то вроде:

http://www.example.com/([A-Za-z0-9/]+) http://www.example.com/?page=$1

А затем с помощью GET-анализатора приложений отфильтруйте его.

3 голосов
/ 28 октября 2008

Вы можете использовать Apache переписывает , чтобы переписать http:// mycompany.com/PartOfUrl1/PartOfUrl2 в http:// mycompany.com/path/to/program.php, а затем передать ArgumentTo/Url/GoesHere в качестве стандартного параметра GET. Итак, что сервер на самом деле отправляет обратно - это ответ для http:// mycompany.com/path/to/program.php?arg=ArgumentTo/Url/GoesHere

Перезапись - это хороший способ защититься от технологических изменений (например, переход с PHP на ASP, например, не изменит ваши URL) и одновременно предоставить дружественные URL вашим пользователям.

Обновление

Используя ваши примеры URL и опираясь на то, что я сказал ранее, я бы сказал, чтобы использовать этот код в вашем httpd.conf или .htaccess:

RewriteEngine On

RewriteRule http:// mycompany.com/PartOfUrl1/PartOfUrl2/([A-Za-z0-9]) http://mycompany.com/path/to/program.php?arg=$1

(Кстати, уберите пробел после первого http:// в RewriteRule, плюс эта строка должна содержать без разрывов строки.)

Смена путей, имен файлов, имени аргумента и т. Д. Вполне подойдет; критические части здесь - регулярное выражение (([A-Za-z0-9])) и $1.

1 голос
/ 28 октября 2008

Да, кодировка Base64 вашего аргумента будет работать для вас, однако вам необходимо убедиться, что весь ваш URL-адрес не превышает ограничение размера вашего целевого браузера (2083 символа для IE 4 - 7, в соответствии с этой страницей ).

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

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

Вот статья MSDN: http://msdn.microsoft.com/en-us/library/ms525347.aspx

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

Я считаю, что если вы используете .net, вам нужен метод HttpUtility.EncodeUrl (), поскольку он имеет много переопределений. Смотрите здесь: http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx

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