Строка URL не равна проверенному адресу
Склейка baseUrl и пользовательского пути ломается на slash, percent encoding, query и fragment. Компоненты разбираются специализированным API, затем проверяются scheme, host, port и назначение. Нормализованный адрес не становится автоматически разрешённым.
Для SSRF-защиты отдельно проверяют DNS и конечный IP на каждом соединении и redirect. Эта задача шире синтаксического parser.
Контракт сообщения
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 этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- 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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .