# П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 | | Статейная доступность | У трёх `
` есть предметные `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.