Интернет и кодирование · 5 минута чтения
Кодировка URL: когда бежать, а когда что-то ломаешь
URL-адреса собираются из символов, которые что-то значат для синтаксического анализатора, и символов, которые являются просто данными, а процентное кодирование позволяет разделить их. Кодировщик URL преобразует последнее в `%XX`, поэтому значение, содержащее `&`, `?` или пробел, сохраняется при поездке. Большинство ошибок URL вовсе не являются ошибками кодирования — они кодируют не ту часть или кодируют дважды.
Обновлено
Что необходимо закодировать
Небольшой набор символов всегда безопасен — буквы, цифры, `-`, `_`, `.` и `~`. Все остальное либо зарезервировано, либо должно быть экранировано. Зарезервированные символы являются интересными, поскольку они разрешены в URL-адресе, но только в определенных позициях: `?` запускает запрос, `&` разделяет параметры, `=` присваивает значение, `#` запускает фрагмент, `/` разделяет сегменты пути. Поместите один из них в незакодированное значение, и вы незаметно перепишете структуру URL-адреса.
Плюс или %20
Космос – классический пример. В пути пробел должен быть `%20`; а `+` это буквальный плюс. В телах `application/x-www-form-urlencoded` и строках запроса, считываемых анализаторами форм, `+` понимается как пробел. Это расхождение объясняет, почему значение может кодироваться во что-то, что работает в одном контексте и не работает в другом, и почему декодеры предлагают обе интерпретации.
Кодируйте компоненты, а не целые URL-адреса. Запуск полного URL через компонентный кодер экранирует его собственные `://` и `?`, создавая ссылку, которая ни к чему не приводит.
Отличие JavaScript, которое привлекает всех
encodeURI('https://x.com/a b?q=1') // keeps :// ? = — for a whole URL
encodeURIComponent('a b?q=1') // escapes ? and = — for one value
`encodeURI` сохраняет структуру URL и предназначен для полного адреса; `encodeURIComponent` экранирует все существенное и предназначено для одного значения параметра. Использование неправильного приводит либо к неработающему URL, либо к неэкранированному значению, а симптомы противоположны: ссылка с ошибкой 404 или строка запроса, которая теряет половину своих параметров.
Двойное кодирование и подписанные URL-адреса
Кодирование уже закодированного значения превращает `%20` в `%2520`, а затем сервер декодирует его один раз и передает вашему приложению литерал `%20` там, где был предназначен пробел. Это проявляется в многоуровневых системах: прокси-сервер перекодирует цель, клиент экранирует полученный URL-адрес, который уже экранирован. Это наиболее важно для подписанных URL-адресов: подписи вычисляются по точной закодированной строке, поэтому изменение экранирования одного символа делает ссылку недействительной, даже если она по-прежнему разрешается к тому же ресурсу.
Декодирование для отладки
Когда ссылка не работает, ее декодирование — это самый быстрый способ узнать, что на самом деле запрашивается у сервера — и ответом часто является значение, которое просочилось в структуру. Работа в браузере означает, что вы можете вставить URL, содержащий токены, подписанные параметры или идентификаторы клиентов, не отправляя его куда-либо. Это именно тот тип URL, который не следует вставлять в службу, регистрирующую запросы.
URL Кодер/декодер — часто задаваемые вопросы
Должен ли пробел быть %20 или знаком плюс?
Используйте `%20` в путях и в любых URL, которые вы создаете сами; оба действительны в строках запроса, где анализаторы форм обычно считывают `+` как пробел. Декодированию необходимо знать, какое соглашение создало строку.
Почему кодирование моего URL дважды нарушает его?
При каждом проходе escape-символ ускользает: пробел становится `%20`, затем `%2520`. По прибытии сервер декодирует один раз, и ваше приложение получает буквальный текст `%20`. Кодируйте один раз, в тот момент, когда необработанное значение становится частью URL.
В чем разница между encodeURI и encodeURIComponent?
`encodeURI` оставляет структурные символы, такие как `://`, `?`, `&` и `=`, нетронутыми, поэтому он подходит для всего адреса. `encodeURIComponent` также экранирует их, поэтому соответствует одному значению параметра. Их смешение является причиной большинства неработающих ссылок.
Инструменты, упомянутые в этом посте
Еще статьи для чтения
5 минута чтения
Base64 декодировать и кодировать: для транспорта, а не для
Base64 декодировать и кодировать в браузере — правило размера 4/3, отступы, вариант base64url и ошибка Unicode, из-за которой декодированный текст выглядит как мусор.
5 минута чтения
cURL для извлечения: перемещение запроса с терминала в браузер
cURL для получения преобразования для JavaScript: заголовки, тела, проверка подлинности и методы отображаются правильно, а также реальность CORS, которая решает, работает ли запрос.
6 минута чтения
JWT декодер: что внутри токена, а что нет
Используйте декодер JWT для проверки заголовка, полезной нагрузки и срока действия токена – и поймите, почему декодирование не проверяется, поскольку проверки утверждений стоят за большинством 401.