Источник, преобразование, sink
Для каждого внешнего значения отметьте источник, все преобразования и место, где оно становится инструкцией: SQL, HTML, URL запроса, путь файла, команда ОС или шаблон. Опасность возникает не от символа самого по себе, а от смены роли данных на код в конкретном интерпретаторе.
Валидация отвечает, допустимо ли значение предметно. Кодирование или параметризация не дают интерпретатору принять значение за инструкцию. Это разные этапы и один не заменяет другой.
Карта угроз
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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .