Блог ClockTools

URL-инструменты

Кодировка URL-адреса для пробелов: %20 или Plus?

Пространство URL-адреса становится %20 в компоненте URI и + только при сериализации в стиле формы.

Автор , разработчик и издатель | | Рассмотрено под ClockTools редакционная политика

Кодирование URL-адресов для пробелов показано на иллюстрации для ClockTools
Оглавление

Пробел в данных URL обычно становится %20, но сериализация запроса в стиле формы представляет его как +. Оба могут быть правильными. Правильный вывод зависит от места назначения: используйте процентное кодирование для отдельного компонента URI и используйте соглашение «плюс» только тогда, когда принимающий рабочий процесс ожидает приложение/x-www-form-urlencoded данные.

Этот ClockTools URL-кодировщик делает этот контекст явным с помощью профилей компонента URI, полного URL-адреса и данных формы. Вставить зеленый чай, переключите профили и сравните выходные данные перед изменением кода приложения.

Начните с пункта назначения

Не спрашивайте: «Какой символ всегда означает пробел?» Спросите, какой парсер получит значение.

Для сегмента пути, значения фрагмента или значения отдельного запроса надежным представлением является процентное кодирование. Байт UTF-8 символа пробела является шестнадцатеричным. 20, поэтому его тройка с процентным кодированием равна %20.

Для данных в стиле формы HTML соглашение о сериализации использует + для пробелов и процентов кодирует буквальный плюс как %2Б. Стандарт URL-адреса WHATWG определяет это поведение, закодированное в виде URL-адреса, отдельно от общего анализа URL-адресов.

Этот Синтаксис URI RFC 3986 определяет октет с процентным кодированием как % за которыми следуют две шестнадцатеричные цифры. Он также отличает зарезервированные разделители от незарезервированных символов данных. Это различие является причиной того, что кодирование значения отличается от кодирования всего адреса.

Диаграмма решений, маршрутизирующая пространство в процент-20 для компонентов URI или плюс для сериализации в стиле формы.
Диаграмма решений, маршрутизирующая пространство в процент-20 для компонентов URI или плюс для сериализации в стиле формы.

Таблица решений %20 по сравнению с плюсом

Пункт назначенияПространственное представлениеПример для зеленый чайПочему
Сегмент пути%20/topics/зеленый%20чайПространство — это данные внутри одного сегмента пути.
Значение запроса, закодированное как компонент%20?q=зеленый%20чайКодировка компонента сохраняет значение отдельно от разделителей.
Запрос или тело запроса в кодировке формы+q=зеленый+чайСериализатор форм отображает пространство в плюс
Полное отображение URL-адреса%20 где буквальное пространство должно быть сериализованоhttps://example.com/green%20tea?q=hot%20cupСтруктурный :, /, ?, =и & оставаться разделителями
Буквальный плюс внутри данных формы%2Бq=C%2B%2BГолый плюс будет декодироваться как пробел в этом профиле.

Последняя строка предотвращает распространенную ошибку. Если предполагаемое значение C++, отправка C++ через декодер формы может создать С . Закодируйте каждый литерал плюс как %2Б перед разбором формы.

Четыре воспроизводимых теста ClockTools

Мы выполнили четыре небольших ввода через текущую реализацию инструмента. Его профиль компонента URI использует JavaScript. кодироватьURIComponent. Данные формы применяют ту же кодировку компонента, а затем заменяют %20 с +. Полный URL-адрес использует кодироватьURI, который сохраняет структуру URL.

ВводПрофильНаблюдаемый результатИнтерпретация
зеленый чайURI-компонентзеленый%20чайОдин компонент, пространство с процентным кодированием
зеленый чайДанные формызеленый+чайСоглашение о пространстве в стиле формы
C++Данные формыC%2B%2BБуквальные знаки плюс защищены
https://example.com/a b?q=x yПолный URL-адресhttps://example.com/a%20b?q=x%20yРазделители URL-адресов остаются структурными

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

Используйте URL-декодер чтобы запустить обратную проверку. Декодировать зеленый%20чай под профилем компонента и зеленый+чай в разделе «Данные формы». Декодер предупреждает, когда под профилем, не являющимся формой, появляется плюс, поскольку предполагаемое значение неоднозначно.

Что защищает кодирование компонентов?

В URL-адресе в качестве грамматики используются пунктуация. В строке запроса & может начать другой параметр и = отделяет имя от значения. # начинается фрагмент. ? начинает запрос. Если один из этих символов принадлежит пользовательским данным, оставление его необработанным может изменить структуру.

Рассмотрим значение таймер и будильник. Кодирование компонентов производит таймер%20%26%20будильник. Амперсанд становится %26, поэтому парсер получает одно значение вместо интерпретации сигнализация в качестве нового параметра.

Кодирование — это представление, а не проверка или шифрование. Перенаправление с процентным кодированием все равно может указывать на неутвержденный хост после декодирования. Закодированный сценарий по-прежнему является ненадежным вводом. Проверьте разрешенные схемы, хосты, имена параметров и бизнес-правила после анализа. Избегайте размещения паролей, токенов или других секретных данных в URL-адресах, поскольку адреса могут появляться в истории, журналах, аналитике, снимках экрана и данных реферера.

Когда вам нужно сравнить строку запроса «до» и «после», Проверка текстовых различий делает каждый измененный escape видимым. Это более надежно, чем сканирование длинного URL-адреса обратного вызова на предмет отсутствия одного из них. %25.

Почему двойное кодирование создает %2520?

Двойное кодирование происходит, когда уже закодированный текст обрабатывается как необработанные данные и кодируется снова.

Начните с одного пробела:

```текст

пробел -> %20

```

Кодировать %20 как новый компонент. Знак процента становится %25, а цифры остаются буквальными:

```текст

%20 -> %2520

```

Одно декодирование меняется %2520 вернуться к %20. Второе декодирование меняется %20 в пространство. Если ваше приложение ожидает один проход декодирования, но получает значение с двойным кодированием, пользователь может увидеть %20 вместо пустого.

Исправление состоит в том, чтобы не выполнять повторное декодирование, пока текст не станет правильным. Повторное декодирование может изменить намеренно закодированные разделители и создать проблемы безопасности. Определите границу владения: ровно один слой должен кодировать компонент, и ровно один соответствующий слой должен его декодировать.

Путь отладки несоответствия пространства

Используйте этот путь, когда одна система отправляет %20 и еще один дисплей +, %2520или буквальный пробел.

1. Захватите необработанное значение до того, как какой-либо анализатор платформы изменит его.

2. Определите, является ли поле сегментом пути, компонентом запроса, полным URL-адресом или телом формы.

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

4. Воспроизведите тот же ввод в соответствующем профиле ClockTools.

5. Декодируйте один раз с помощью принимающего профиля.

6. Сравните результат с ожидаемым значением.

7. Найдите в потоке приложения второй кодер или декодер, если %25 появляется неожиданно.

СимптомПервая проверкаВероятная причина
зеленый+чай остается с плюсомПрофиль декодераДекодер компонента не отображает плюс в пространство
C++ становится С Кодировка отправителяБуквальные знаки плюс не кодировались как %2Б
%20 виден пользователюСчетчик декодированияЗакодированные данные никогда не декодировались или ранее подвергались двойному кодированию.
%2520 появляется в запросеКоличество кодировокЗнак процента от %20 был закодирован снова
Запрос разбивается после амперсандаГраница компонентаАмперсанд данных остался необработанным

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

Когда следует кодировать полный URL-адрес?

Используйте профиль «Полный URL-адрес» только в том случае, если вы хотите, чтобы адрес оставался адресом. Он сохраняет структурные знаки пунктуации, такие как двоеточие схемы, косая черта, вопросительный знак, знак равенства, амперсанд и маркер фрагмента, при кодировании таких символов, как пробелы.

Используйте компонент URI, когда полный URL-адрес вложен в другой параметр. Например, адрес обратного вызова, помещенный в перенаправление= это данные с точки зрения внешнего URL. Кодирование вложенного адреса как одного компонента предотвращает его ? и & от присоединения к внешнему запросу.

Не передавайте адрес повторно через разные профили в надежде получить универсально безопасную строку. Напишите границу явно:

```текст

внешняя структура URL + encodeURIComponent (внутренний URL обратного вызова)

```

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

Часто задаваемые вопросы

Должен ли пробел URL-адреса быть %20 или знаком плюса?

Используйте %20 для пробела внутри общего компонента URI. Используйте +, если принимающий рабочий процесс явно ожидает сериализации application/x-www-form-urlencoded.

Почему знак плюс декодируется как пробел?

Синтаксические анализаторы в стиле формы отображают + в пробел как часть соглашения о кодировке формы. Декодер общего компонента не должен применять эту замену.

Как закодировать буквальный знак плюс в данных формы?

Закодируйте плюс как %2B. В противном случае декодер формы может интерпретировать пустой плюс как пробел.

Что означает %2520?

%2520 обычно указывает на двойное кодирование. Знак процента в существующем escape-коде %20 стал %25, поэтому одно декодирование возвращает %20, а второе декодирование возвращает пробел.

Должен ли я кодировать весь URL-адрес с помощью encodeURIComponent?

Не тогда, когда его схема, косые черты, разделители запроса и маркер фрагмента должны оставаться структурными. Используйте компонентную кодировку, когда весь URL-адрес вложен как данные в другое значение.

Обеспечивает ли кодирование URL-адресов безопасность ненадежного ввода?

Нет. Кодирование сохраняет границы синтаксиса, но получатель все равно должен проверять схемы, хосты, перенаправления, значения параметров, разрешения и другие бизнес-правила после анализа.

Об авторе

Винешваран Виджаякумар

Основатель, разработчик и издатель ClockTools | Менеджер по цифровому маркетингу | Индия

Винешваран — инженер с многолетним техническим опытом, в том числе профессиональной работой менеджером по цифровому маркетингу в Дубае. Его работа объединяет анализ данных, поисковую оптимизацию, оптимизацию коэффициента конверсии, контент-системы, визуальное производство, а также прикладной искусственный интеллект и машинное обучение. В ClockTools он превращает этот междисциплинарный опыт в специализированные утилиты для браузера и практические руководства с учетом исходных кодов.

Профиль в LinkedIn