Глоссарий

URL-кодирование

процентное кодированиеpercent-encoding

URL-кодирование представляет байт в компоненте URI знаком процента и двумя шестнадцатеричными цифрами.

Определение

URL-кодирование, точнее процентное кодирование, представляет байт знаком % и двумя шестнадцатеричными цифрами. Например, пробел можно записать как %20, а сам знак процента — как %25.

Незарезервированные символы URI — латинские буквы ASCII, цифры, -, ., _ и ~ — обычно не меняются. Необходимость кодировать остальные символы зависит от их позиции и роли в URI.

Как это работает

Текст вне ASCII сначала преобразуют в байты, обычно в UTF-8, а затем нужные байты кодируют по отдельности. Поэтому café в UTF-8 превращается в caf%C3%A9.

Зарезервированные символы /, ?, #, & и = задают структуру URL. Их обработка зависит от того, находятся данные в сегменте пути, параметре запроса, фрагменте или другом компоненте.

Пробелы и данные форм

Обычное процентное кодирование записывает пробел как %20. Формат application/x-www-form-urlencoded, применяемый в строках запроса и HTML-формах, часто обозначает пробел знаком +; буквальный плюс тогда записывают как %2B.

Библиотеки обычно предоставляют отдельные функции для полного URL, сегмента пути и значения параметра. Функция для конкретного компонента не даст ошибочно скрыть или сохранить структурные разделители.

Безопасность и частые ошибки

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

Повторное кодирование знака процента создаёт двойное кодирование: %20 становится %2520. Декодированные данные всё равно нужно проверять, поскольку кодирование не обезвреживает вредоносный или некорректный ввод.

Частые вопросы

%20 — процентная запись байта пробела. Знак + означает пробел именно в кодировании данных форм; в другом контексте он может быть обычным плюсом.

Обычно нет. Сегменты пути и значения параметров кодируют функциями для соответствующего компонента, чтобы структурные разделители сохранили смысл.

Нет. Оно обеспечивает синтаксическую совместимость, но не даёт конфиденциальность, целостность или аутентичность.

См. также
Связанные инструменты