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

155 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Автономное тройное ревью П33 · ноябрь 2020 · «Минимальная защита веб-приложения»
Статус: **принят независимым редактором в выпусковой набор**. В module ровно
три revision для стабильных slug:
- <code>editorial-2020-11-practice-security-baseline</code>;
- <code>editorial-2020-11-mechanism-security-baseline</code>;
- <code>editorial-2020-11-field-security-baseline</code>.
Созданы только пять разрешённых файлов П33:
- <code>web/scripts/upgrade-2020-11.mjs</code>;
- <code>web/public/assets/editorial/2020/security-baseline-asset-threat-control-2020.svg</code>;
- <code>web/public/assets/editorial/2020/security-baseline-request-boundary-2020.svg</code>;
- <code>web/public/assets/editorial/2020/security-baseline-diagnosis-2020.svg</code>;
- этот документ.
Module export не задаёт <code>date</code> или <code>author</code>. Он не
подключает registry и не меняет базовый архив. <code>articles.json</code>,
редакционный стандарт, очередь, package config, Git и чужие незакоммиченные
файлы данным пакетом не изменялись.
## Проход 1. Факты и техника — пройдено
| Утверждение | Первичный или официальный источник | Проверенная граница |
| --- | --- | --- |
| Для исторической статьи нужен конкретный, а не «последний» ASVS | [OWASP ASVS 4.0.2 — release, 28 October 2020 UTC](https://github.com/OWASP/ASVS/releases/tag/v4.0.2_release) | Текст называет 4.0.2 версией, доступной в ноябре 2020 года; он не использует ASVS 5.x и не объявляет учебный маршрут соответствующим стандарту |
| Риск удобно называть понятиями эпохи, но Top 10 не является конфигурацией сервера | [OWASP Top 10:2017](https://owasp.org/www-project-top-ten/2017/) | Материалы используют версию 2017 года для разговора о рисках; active, threat, control и evidence всё равно определены для одного route |
| Cookie и Set-Cookie описывают перенос состояния и отдельные атрибуты | [RFC 6265 — HTTP State Management Mechanism, April 2011](https://www.rfc-editor.org/rfc/rfc6265) | <code>Secure</code>, <code>HttpOnly</code> и <code>Path=/admin</code> показаны как transport contract учебной cookie, не как замена permission или CSRF control |
| CSP2 передаётся response header и остаётся defence in depth | [W3C CSP Level 2 — Recommendation, 15 December 2016](https://www.w3.org/TR/2016/REC-CSP2-20161215/) | Policy не названа лечением input validation, output encoding или server-side authorisation; applicability директив оставлена вопросом к реальным browser и assets |
| Конфигурация header должна сверяться с установленным сервером | [nginx: ngx_http_headers_module / add_header](https://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header) | Фрагмент — учебная форма области <code>/admin/</code>; в нём нет реального upstream, hostname, certificate или утверждения о применённой конфигурации |
### Техническая граница учебной фикстуры
<code>runSecurityBaselineFixture()</code> создаёт четыре object request в
памяти для origin <code>https://admin.example.test</code>:
- ожидаемый <code>POST /admin/profile</code> с известной учебной session,
origin, CSRF token и <code>profile:write</code>;
- тот же маршрут с <code>https://other.example.test</code>;
- тот же маршрут с пустым token;
- тот же маршрут с <code>profile:read</code>.
<code>evaluateTrainingStateChange()</code> принимает решение до synthetic
update: route, session, origin, token и permission проверяются раздельно.
Ожидаемый запрос получает <code>204</code>; три изменённых входа получают
<code>403</code>. Отдельно 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 с
самостоятельными <code>alt</code>/<code>figcaption</code>, table с
<code>caption</code>/<code>thead</code>, 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 — пройдено в пределах пакета
- <code>security-baseline-asset-threat-control-2020.svg</code> — вертикальная
матрица трёх учебных активов: изменение профиля, session и разметка. У
каждого есть threat, control и отдельное evidence.
- <code>security-baseline-request-boundary-2020.svg</code> — вертикальный путь
request: HTML form → proxy contract → session → form context → permission →
response/evidence. Он явно отделяет <code>401</code> от <code>403</code>.
- <code>security-baseline-diagnosis-2020.svg</code> — четыре карточки
«symptom → cause → check → action»: foreign origin, пустой token,
недостаточное permission и неполный response contract.
- У SVG есть <code>title</code>, <code>desc</code>, <code>role="img"</code>,
вертикальные viewBox, контрастные карточки и короткие строки. В assets нет
JavaScript, <code>foreignObject</code>, 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.
### Фактически выполненные проверки
После финальной редакторской правки выполнены:
<pre><code>cd web &amp;&amp; node --check scripts/upgrade-2020-11.mjs
cd web &amp;&amp; npm run audit:draft -- scripts/upgrade-2020-11.mjs
cd web &amp;&amp; node scripts/upgrade-2020-11.mjs --verify-fixture
cd web &amp;&amp; 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</code></pre>
| Проверка | Реальный результат |
| --- | --- |
| <code>node --check</code> | 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 и <code>profile:read</code> отклонены; CSP и Set-Cookie contract присутствуют |
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
| Sharp mobile preflight | PASS: три PNG шириной 375 px просмотрены; clipping, наложений и horizontal overflow внутри SVG не обнаружено |
| Scope/self-review | PASS: revision не содержит <code>date</code>/<code>author</code>; созданы только пять файлов П33; registry, archive, standard, queue, package config, Git, illustrations и чужие незакоммиченные файлы не редактировались |
## Независимая интеграционная приёмка
Основной редактор 31 июля 2026 года подключил три revision к
<code>web/data/editorial-revisions.mjs</code>, не меняя базовый
<code>articles.json</code>, даты или автора архивных записей. В registry стало
94 revision. Перед приёмкой независимо сверена дата ASVS 4.0.2 по API release:
<code>published_at = 2020-10-28T22:06:31Z</code>. В тексте и источнике
исправлено ошибочное «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 остаётся источником её фактической записи.