Files
progcode/editorial/reviews/2023-03-draft.md
T
huncode b56f7e94b9
Build and deploy / deploy (push) Successful in 16s
revise March 2023 CSRF CORS articles
2026-07-31 14:38:08 +03:00

66 lines
7.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# П61 · 2023-03 · CSRF и CORS — self-review
Пакет подготовлен как import-safe replacement для трёх уже существующих slug. В `articles.json`, registry, README и очереди изменений нет: источником ревизий остаётся `web/scripts/upgrade-2023-03.mjs`.
## 1. Факты и модель
| Проверка | Evidence | Вердикт |
| --- | --- | --- |
| Origin не подменён словом «сайт» | Во всех трёх статьях origin описан как tuple scheme, host, port; fixture отклоняет тот же host с port `8443` и path в поле origin. Основание: RFC 6454, декабрь 2011. | PASS |
| CORS не объявлен CSRF-защитой | Текст отделяет доступ JavaScript к response от server-side решения о mutation. W3C CORS Recommendation (16.01.2014) отдельно говорит о simple credentialed request и необходимости CSRF-защиты state-changing resource. | PASS |
| Credentials и wildcard описаны точно | Для credentialed response указан exact origin плюс `Access-Control-Allow-Credentials: true`; `*` не выдан за допустимый вариант. Это сверено с W3C CORS Recommendation и Fetch snapshot от 24.03.2023. | PASS |
| Preflight не выдан за proof intent | Статьи называют его CORS gate для request shape. Контрпримером служит form-shaped POST без custom header: fixture даёт `safelisted-shape`, но серверный контракт возвращает `deny-token`. | PASS |
| Fixture не изображает сетевой repro | Комментарий, boundary и статьи прямо фиксируют: нет browser, Fetch, сети, cookie jar, OPTIONS и API. Inputs — заданные labels, а не прочитанный trace. `node … --verify-fixture` прошёл 12/12 assertions. | PASS |
| Источники соответствуют периоду | RFC 6454 (2011), W3C CORS Recommendation (2014) и зафиксированный WHATWG Fetch snapshot (24.03.2023) доступны не позднее 2023-03. У каждого указана граница применимости. | PASS |
Оговорка сохранена в каждой статье: реальный browser/API test с двумя controllable origin и безопасной test session — отдельный артефакт. Его нельзя заменять fixture PASS.
## 2. Язык, полнота и объём
| Slug | Основной текст | Содержательные требования | Вердикт |
| --- | ---: | --- | --- |
| `editorial-2023-03-practice-csrf-cors` | 9 984 знака | проблема и цена в начале; таблица; contract code; figure с alt/caption; маршрут; ограничения; 3 официальных источника | PASS |
| `editorial-2023-03-mechanism-csrf-cors` | 9 944 знака | tuple origin, credentials, preflight и CSRF разделены; таблица; code; figure; маршрут; историческая оговорка | PASS |
| `editorial-2023-03-field-csrf-cors` | 9 991 знак | диагностика по evidence; таблица «симптом → причина → проверка → действие»; fixture command; figure; ограничения и критерий готовности | PASS |
Проверен голос М6 для 2023 года: короткая практичная речь, видимые владельцы решений, отрицательные ветки и ограничения рядом с решением. Нет заявлений о выдуманных инцидентах, метриках или результатах команды. `audit:draft` также не нашёл шаблонных оборотов, следов генерации, пропущенных таблиц, code example, figure, источников или ранней постановки проблемы.
## 3. SVG, доступность и безопасность
| Проверка | Результат | Вердикт |
| --- | --- | --- |
| XML | `xmllint --noout` прошёл для трёх SVG. | PASS |
| SVG safety | Нет `script`, `foreignObject`, `iframe`, `image`, `href`/external reference, DOCTYPE, ENTITY или inline event handler. У каждого SVG есть уникальные `csrf-cors-2023-*` title/desc и `role="img"`. | PASS |
| Статейная доступность | У трёх `<figure>` есть предметные `alt` и caption; `audit:draft` проверил их наличие. | PASS |
| Sharp 375 px | Рендеры: 375×250, 375×250 и 375×263. Первый просмотр показал слишком плотные и частично обрезанные подписи; SVG были упрощены и перенесены. Повторный просмотр: заголовки, ветки и финальные действия помещаются без обрезания. | PASS после правки |
## Команды выпуска
```text
node --check web/scripts/upgrade-2023-03.mjs
PASS
node web/scripts/upgrade-2023-03.mjs --verify-fixture
PASS fixture: 12/12 assertions; in-memory contract only
npm run audit:draft -- scripts/upgrade-2023-03.mjs
PASS editorial-2023-03-practice-csrf-cors: 9984 body chars
PASS editorial-2023-03-mechanism-csrf-cors: 9944 body chars
PASS editorial-2023-03-field-csrf-cors: 9991 body chars
import-safe export
PASS: 3 revisions; date/author absent
xmllint + SVG safety scan + Sharp 375 px render
PASS
```
`npm` напечатал три предупреждения о неизвестных пользовательских config (`store-dir`, `cache-dir`, `public-hoist-pattern`); аудит завершился с кодом 0 и к содержимому пакета они не относятся.
## Интеграционная приёмка
- Основной редактор ужесточил `canonicalOrigin()`: origin label с path, query или hash теперь отклоняется до CORS/CSRF-решений. Новая отрицательная ветка фиксирует, что CORS allow-list не является ограничением по URL-path; fixture — PASS 12/12. Исторический Fetch snapshot дополнительно проверен HTTP 200 с `Last-Modified: 24 Mar 2023`.
- Ревизии добавлены в `web/data/editorial-revisions.mjs` поверх трёх исходных slug. `web/data/articles.json`, даты и авторы не изменялись; в registry 181 уникальная ревизия без дубликатов.
- Строгий аудит `npm run audit:articles -- editorial-2023-03-practice-csrf-cors editorial-2023-03-mechanism-csrf-cors editorial-2023-03-field-csrf-cors` — PASS: у каждой статьи 1 figure, 1 table и 1 code example.
- Production-сборка `cd web && npm run build` — PASS: 374 статические страницы. README обновлён с 187/358 до 190/358 принятых материалов; осталось 168.