Files
progcode/editorial/reviews/2020-11-draft.md
T
huncode 41c3aca967
Build and deploy / deploy (push) Successful in 15s
revise November 2020 security articles
2026-07-31 11:59:30 +03:00

14 KiB
Raw Blame History

Автономное тройное ревью П33 · ноябрь 2020 · «Минимальная защита веб-приложения»

Статус: принят независимым редактором в выпусковой набор. В module ровно три revision для стабильных slug:

  • editorial-2020-11-practice-security-baseline;
  • editorial-2020-11-mechanism-security-baseline;
  • editorial-2020-11-field-security-baseline.

Созданы только пять разрешённых файлов П33:

  • web/scripts/upgrade-2020-11.mjs;
  • web/public/assets/editorial/2020/security-baseline-asset-threat-control-2020.svg;
  • web/public/assets/editorial/2020/security-baseline-request-boundary-2020.svg;
  • web/public/assets/editorial/2020/security-baseline-diagnosis-2020.svg;
  • этот документ.

Module export не задаёт date или author. Он не подключает registry и не меняет базовый архив. articles.json, редакционный стандарт, очередь, package config, Git и чужие незакоммиченные файлы данным пакетом не изменялись.

Проход 1. Факты и техника — пройдено

Утверждение Первичный или официальный источник Проверенная граница
Для исторической статьи нужен конкретный, а не «последний» ASVS OWASP ASVS 4.0.2 — release, 28 October 2020 UTC Текст называет 4.0.2 версией, доступной в ноябре 2020 года; он не использует ASVS 5.x и не объявляет учебный маршрут соответствующим стандарту
Риск удобно называть понятиями эпохи, но Top 10 не является конфигурацией сервера OWASP Top 10:2017 Материалы используют версию 2017 года для разговора о рисках; active, threat, control и evidence всё равно определены для одного route
Cookie и Set-Cookie описывают перенос состояния и отдельные атрибуты RFC 6265 — HTTP State Management Mechanism, April 2011 Secure, HttpOnly и Path=/admin показаны как transport contract учебной cookie, не как замена permission или CSRF control
CSP2 передаётся response header и остаётся defence in depth W3C CSP Level 2 — Recommendation, 15 December 2016 Policy не названа лечением input validation, output encoding или server-side authorisation; applicability директив оставлена вопросом к реальным browser и assets
Конфигурация header должна сверяться с установленным сервером nginx: ngx_http_headers_module / add_header Фрагмент — учебная форма области /admin/; в нём нет реального upstream, hostname, certificate или утверждения о применённой конфигурации

Техническая граница учебной фикстуры

runSecurityBaselineFixture() создаёт четыре object request в памяти для origin https://admin.example.test:

  • ожидаемый POST /admin/profile с известной учебной session, origin, CSRF token и profile:write;
  • тот же маршрут с https://other.example.test;
  • тот же маршрут с пустым token;
  • тот же маршрут с profile:read.

evaluateTrainingStateChange() принимает решение до synthetic update: route, session, origin, token и permission проверяются раздельно. Ожидаемый запрос получает 204; три изменённых входа получают 403. Отдельно fixture проверяет только presence CSP и Set-Cookie полей в объекте response contract.

У fixture нет URL fetch, DNS, HTTP parser, browser, cookie jar, nginx, proxy process, TLS, сети, scan, production session или реального token. Она не находит уязвимости и не доказывает delivery header от сервера. Это намеренная граница: fixture охраняет логический contract статьи, а интеграционная проверка должна появиться только на разрешённом стенде.

Вердикт прохода: пройден. Факты привязаны к источникам и версиям, исторический ASVS отделён от текущих редакций, а synthetic модель не выдаётся за security assessment.

Проход 2. Редактура, глубина и голос М3 — пройдено

Ревизия Симптом и цена в первых двух абзацах Главный вопрос Объём основного текста
Практика Headers и проверка пользователя существуют отдельно; цена — оставить state change без нужного gate и принять success за evidence Как собрать для одного route матрицу «актив → угроза → control → evidence» 11 043 знака body
Механизм Набор cookie flags и CSP не показывает, где request должен остановиться; цена — перепутать session, form context, permission и response policy Почему baseline — это несколько границ запроса, а не список headers 10 860 знаков body
Полевой разбор Checklist утверждает «защита включена», но не называет request; цена — потерять token, permission или response contract после правки Как получить воспроизводимое evidence без scan и без claims о production 10 223 знака body
  • У каждой revision есть problem и цена в двух первых абзацах, затем последовательность «симптом → причина → проверка → действие».
  • В каждом тексте больше пяти тематических разделов, одна figure с самостоятельными alt/figcaption, table с caption/thead, HTTP/config/code/fixture example, нумерованный маршрут и пять официальных ссылок.
  • Автор ноября 2020 года систематизирует безопасность вокруг одного маршрута, но не говорит голосом современного AppSec/SRE-лида: нет claim о complete coverage, pentest, zero-trust platform, CVE scan, dashboard или зрелой программе compliance.
  • Термины session, CSRF token, permission, CSP и evidence привязаны к request/response contract. Нет общих фраз о «защите сайта вообще» и нет обещания, что один header закрывает XSS, CSRF или authorisation.
  • Обновлённые titles и excerpts обещают ровно ограниченный результат: учебный маршрут и evidence controls, а не универсальную hardening recipe.

Второй проход отдельно проверил потенциальные анахронизмы. В источниках зафиксированы ASVS 4.0.2 (октябрь 2020), Top 10:2017, RFC 6265 (2011) и CSP2 (2016). Современные редакции OWASP и современный security stack не использованы как будто были практикой автора в 2020 году.

Вердикт прохода: пройден. Тексты укладываются в диапазон 5 000–15 000 знаков, остаются технически плотными и постепенно расширяют автора от frontend/delivery инженерии к базовой систематизации безопасности.

Проход 3. Визуал, fixture и выпусковой preflight — пройдено в пределах пакета

  • security-baseline-asset-threat-control-2020.svg — вертикальная матрица трёх учебных активов: изменение профиля, session и разметка. У каждого есть threat, control и отдельное evidence.
  • security-baseline-request-boundary-2020.svg — вертикальный путь request: HTML form → proxy contract → session → form context → permission → response/evidence. Он явно отделяет 401 от 403.
  • security-baseline-diagnosis-2020.svg — четыре карточки «symptom → cause → check → action»: foreign origin, пустой token, недостаточное permission и неполный response contract.
  • У SVG есть title, desc, role="img", вертикальные viewBox, контрастные карточки и короткие строки. В assets нет JavaScript, foreignObject, external URL или raster data URI.
  • Static mobile preflight отрендерил все три SVG через Sharp до ширины 375 px: 375×796, 375×740 и 375×781. Визуально проверены заголовки, отсутствие clipping, наложений и горизонтального overflow внутри схем. Это проверка static SVG asset, не browser-run и не проверка screen reader.

Фактически выполненные проверки

После финальной редакторской правки выполнены:

cd web && node --check scripts/upgrade-2020-11.mjs
cd web && npm run audit:draft -- scripts/upgrade-2020-11.mjs
cd web && node scripts/upgrade-2020-11.mjs --verify-fixture
cd web && xmllint --noout \
  public/assets/editorial/2020/security-baseline-asset-threat-control-2020.svg \
  public/assets/editorial/2020/security-baseline-request-boundary-2020.svg \
  public/assets/editorial/2020/security-baseline-diagnosis-2020.svg
Проверка Реальный результат
node --check PASS, code 0
Import-safe export и draft gate PASS: 11 043 / 10 860 / 10 223 знаков body; три slug, tables, figures, code, routes, sources и assets найдены
In-memory fixture PASS: expected request принят; foreign origin, пустой token и profile:read отклонены; CSP и Set-Cookie contract присутствуют
xmllint --noout PASS, все три SVG — корректный XML
Sharp mobile preflight PASS: три PNG шириной 375 px просмотрены; clipping, наложений и horizontal overflow внутри SVG не обнаружено
Scope/self-review PASS: revision не содержит date/author; созданы только пять файлов П33; registry, archive, standard, queue, package config, Git, illustrations и чужие незакоммиченные файлы не редактировались

Независимая интеграционная приёмка

Основной редактор 31 июля 2026 года подключил три revision к web/data/editorial-revisions.mjs, не меняя базовый articles.json, даты или автора архивных записей. В registry стало 94 revision. Перед приёмкой независимо сверена дата ASVS 4.0.2 по API release: published_at = 2020-10-28T22:06:31Z. В тексте и источнике исправлено ошибочное «27 октября» на «28 октября 2020 UTC»; вывод о доступности версии в ноябре не изменился.

Проверка после интеграции Реальный результат
Строгий audit трёх slug PASS: 11 043 / 10 860 / 10 223 знаков; у каждой статьи есть figure, table и code examples
Production build PASS: Next.js собрал 374 статические страницы
Независимый mobile visual review PASS: основной редактор повторно просмотрел три SVG после Sharp-рендера в 375 px; clipping, overlap и overflow не обнаружены

Ни этот отчёт, ни интеграция не утверждают запуск web server, HTTP, browser, scanner, реальный токен, cookie jar или security assessment.

Выпусковой вердикт: ACCEPT. Commit и push выполняются отдельной публикационной операцией; Git остаётся источником её фактической записи.