Самоучитель: динамические веб-приложения
Глава 11 из 18V. Доверие и безопасность120 минут

Глава 11. Безопасность по маршруту данных

Вместо списка страшных сокращений проследите данные от источника до опасной операции и примените контроль в правильном контексте.

После главы вы сможете
  • построить threat model
  • выбрать контекстную защиту
  • не смешивать валидацию и экранирование

Источник, преобразование, sink

Для каждого внешнего значения отметьте источник, все преобразования и место, где оно становится инструкцией: SQL, HTML, URL запроса, путь файла, команда ОС или шаблон. Опасность возникает не от символа самого по себе, а от смены роли данных на код в конкретном интерпретаторе.

Валидация отвечает, допустимо ли значение предметно. Кодирование или параметризация не дают интерпретатору принять значение за инструкцию. Это разные этапы и один не заменяет другой.

Карта угроз

Контроль потока данныхКаждая граница проверяет свой риск; универсальной функции очистки не существует.ИсточникrequestSchemavalidateUse caseauthorizeAdapterparameterizeOutputencode
Каждая граница проверяет свой риск; универсальной функции очистки не существует.

SQL и HTML

Для SQL значения передаются через prepared statements, а идентификаторы выбираются из allowlist. Для HTML применяйте контекстное экранирование непосредственно при выводе. Не храните заранее HTML-экранированный текст как исходное значение: он испортится при повторном выводе и не станет безопасным для JSON или атрибута.

Если разрешён пользовательский HTML, нужен специализированный sanitizer с allowlist тегов и атрибутов. strip_tags не является полной политикой.

CSRF и CORS отвечают на разное

CSRF эксплуатирует автоматическую отправку credentials браузером и требует проверки намерения. CORS определяет, может ли JavaScript другого origin прочитать ответ; он не запрещает серверу получить сам запрос. Поэтому заголовок Access-Control-Allow-Origin не заменяет CSRF-токен.

Для credentialed CORS нельзя бездумно отражать Origin и использовать wildcard. Разрешённые origins перечисляются явно, ответ добавляет Vary: Origin.

SSRF, пути и процессы

URL, который загружает сервер, проверяют по схеме, назначению и разрешённым хостам; после DNS-разрешения контролируют адреса внутренних диапазонов и повторяют проверку при редиректе. Путь файла строится сервером и сверяется с разрешённой базовой областью. Пользовательский ввод не передаётся в shell, include или require.

В учебном Playground произвольный PHP выполняется только в отдельном WebAssembly Worker без серверного eval, shell и доступа к пользовательскому пути — это пример архитектурного устранения риска.

Секреты и зависимости

Секрет не попадает в репозиторий, клиентский bundle, URL, исключение или аналитическое событие. Зависимости фиксируются lock-файлами, обновляются отдельным процессом и проверяются на известные уязвимости. Удаляйте пакет, если его функция больше не нужна: неиспользуемая зависимость остаётся поверхностью атаки.

Security headers, CSP и SameSite полезны как дополнительные слои, но не исправляют уязвимую предметную операцию.

Практика главы

Постройте threat model для импорта изображения по URL. Отметьте SSRF, размер, редиректы, MIME, декодирование, хранение и вывод. Для каждого риска назовите конкретный контроль и место выполнения.

Локальный прогресс

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

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

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

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

  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • developer.mozilla.orghttps://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORSПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

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

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

Аналитика

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

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

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

Политики

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