Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 13 из 20IV. Потоки и протоколы120 минут

Глава 13. URI, JSON и стабильный wire format

Wire format — публичный контракт: он отделяет данные от объектов процесса, версионируется и проверяется до создания предметной модели.

После главы вы сможете
  • разбирать URI по компонентам
  • проектировать JSON envelope
  • избегать unsafe unserialize

Строка URL не равна проверенному адресу

Склейка baseUrl и пользовательского пути ломается на slash, percent encoding, query и fragment. Компоненты разбираются специализированным API, затем проверяются scheme, host, port и назначение. Нормализованный адрес не становится автоматически разрешённым.

Для SSRF-защиты отдельно проверяют DNS и конечный IP на каждом соединении и redirect. Эта задача шире синтаксического parser.

Контракт сообщения

От wire format к EventКаждый слой имеет свою ошибку; неизвестная версия не декодируется как знакомая структура.Bytessize/UTF-8JSONdecodeEnvelopeversionPayloadschemaEventvalidated
Каждый слой имеет свою ошибку; неизвестная версия не декодируется как знакомая структура.

URI extension PHP 8.5

PHP 8.5 добавил встроенное URI-расширение с моделями RFC 3986 и WHATWG URL. Оно лучше выражает компоненты и неизменяемые изменения адреса, чем ручная конкатенация. Выбор модели зависит от протокола: серверный URI и браузерный URL имеют разные правила.

Синтаксис используется только после фактического обновления runtime. До этого Pulse держит UriPort интерфейс и адаптер текущей платформы, чтобы миграция не разносила условные ветви по ядру.

JSON с явной ошибкой

json_decode вызывается с JSON_THROW_ON_ERROR и ограничением depth. Успешный decode ещё не доказывает shape: envelope требует version, eventId, occurredAt и payload. Числа, выходящие за безопасный диапазон потребителя, передаются строкой по договору.

json_encode также может завершиться ошибкой. Pulse не подменяет её пустой строкой и не отправляет частичный отчёт. Порядок ключей не считается semantic contract, если только байты не канонизированы для подписи.

Почему не unserialize внешний ввод

PHP object serialization связывает данные с классами и magic methods процесса. Недоверенный payload способен инициировать цепочку объектов и побочные эффекты. Для внешнего сообщения Pulse использует JSON с простой schema и явными factory.

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

Лаборатория

Спроектируйте envelope v1 и обработайте неизвестную v2, слишком глубокий JSON и invalid UTF-8. Разберите callback URI, разрешив только https и два хоста.

  • Размер ограничен до decode.
  • Неизвестная версия отклонена явно.
  • Внешний ввод не проходит через unserialize.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Достаточно ли валидного URI для разрешения исходящего запроса?
2. Что делать с неизвестной version envelope?

Перелинковка со справочником

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

  • php.nethttps://www.php.net/manual/en/book.uri.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/book.json.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie