Полное руководство по URL-кодированию
Узнайте всё об URL-кодировании: что это такое, почему это важно, как работает процентное кодирование и какие есть лучшие практики для обработки специальных символов в URL.
Что такое URL-кодирование?
URL-кодирование, также известное как процентное кодирование (percent-encoding), — это механизм кодирования информации в унифицированном идентификаторе ресурса (URI) при определённых условиях. Хотя его называют URL-кодированием, оно применяется и в более широком смысле ко всему множеству унифицированных идентификаторов ресурсов (URI), которое включает как унифицированный указатель ресурса (URL), так и унифицированное имя ресурса (URN).
Кодирование необходимо потому, что URL можно передавать через интернет только с использованием набора символов ASCII. Поскольку URL часто содержат символы за пределами набора ASCII, URL приходится преобразовывать в допустимый формат ASCII. При URL-кодировании небезопасные символы ASCII заменяются символом %, за которым следуют две шестнадцатеричные цифры.
Как работает процентное кодирование?
Механизм процентного кодирования преобразует каждый символ, который нужно закодировать, в один или несколько байтов. Затем каждый байт представляется знаком процента, за которым следуют две шестнадцатеричные цифры. Шестнадцатеричные цифры представляют значение байта символа в заданной кодировке (обычно UTF-8).
Например, символ пробела (значение ASCII 32, hex 20) превращается в %20. Амперсанд & (значение ASCII 38, hex 26) превращается в %26. Символы, не входящие в ASCII, например e с акутом, сначала кодируются в последовательность байтов UTF-8, а затем каждый байт подвергается процентному кодированию.
Зарезервированные и незарезервированные символы
RFC 3986 определяет для URI две категории символов: зарезервированные и незарезервированные. К незарезервированным символам относятся прописные и строчные буквы (A-Z, a-z), цифры (0-9), дефисы (-), точки (.), символы подчёркивания (_) и тильды (~). Эти символы можно включать в URI без кодирования.
Зарезервированные символы имеют особое значение в синтаксисе URL. К ним относятся: :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ; и =. Когда эти символы используются в компоненте URI не по своему зарезервированному назначению, их необходимо подвергать процентному кодированию.
URL-кодирование в разных языках
JavaScript
JavaScript предоставляет две пары функций для URL-кодирования: encodeURI() / decodeURI() для кодирования полных URI и encodeURIComponent() / decodeURIComponent() для кодирования отдельных компонентов URI. Ключевое различие в том, что encodeURI() сохраняет зарезервированные символы, имеющие особое значение в URI (такие как /, ?, #), тогда как encodeURIComponent() кодирует все неалфавитно-цифровые символы.
Python
Модуль urllib.parse в Python предоставляет функции quote() и unquote() для базового кодирования и декодирования, а также urlencode() для кодирования словарей в строки запроса. Функция quote() принимает необязательный параметр safe, позволяющий указать символы, которые не следует кодировать.
PHP
PHP предлагает функцию urlencode(), которая кодирует пробелы как + (в соответствии с форматом application/x-www-form-urlencoded), и rawurlencode(), которая кодирует пробелы как %20 (в соответствии с RFC 3986). Для декодирования используйте urldecode() и rawurldecode() соответственно.
Лучшие практики
- Всегда кодируйте пользовательский ввод перед включением его в URL
- Используйте
encodeURIComponent()для кодирования значений параметров запроса в JavaScript - Используйте
encodeURI()только при кодировании полного URI - Придерживайтесь единообразного подхода к кодированию во всём приложении
- Всегда декодируйте URL на стороне сервера перед их обработкой
- Тестируйте кодирование со специальными символами, включая Unicode
- Не кодируйте URL дважды — всегда проверяйте, не является ли строка уже закодированной