Skip to content
EN

Методология · Открытая формула

Методология Security Grade v1.2

Открытая формула 0–100: четыре взвешенные категории и сводный балл под ней.

Кратко. Security Grade на /security (v1.2) — взвешенное среднее четырёх категорий, каждая берётся долей от своего максимума: заголовки безопасности 60 %, HTTPS 20 %, cookie 10 %, раскрытие информации 10 %. Итог 0–100 переводится в букву: A+ от 90, A от 80, B от 70, C от 55, D от 35, F ниже. Тот же балл и буква возвращаются в API (/api/v4/security). Под оценкой /security показывает второе число — сводный балл по 9 категориям; он считается иначе и описан ниже. Движки: src/security.php, src/security-headers.php, src/security-composite.php.
Заголовки60%HTTPS20%Cookies10%Раскрытие10%
История версий. v1.2 (2026-10-05) — заголовки берутся из итогового ответа после редиректов (раньше — из первого); cookie итоговой страницы — всегда; промежуточных редиректов — только того же сайта; удаления не учитываются. v1.1 (2026-10-05) — формула не менялась, исправлено её описание. С публикации страница описывала формулу, которую движок не считал: не сумма пяти категорий на 55 баллов, а взвешенное среднее четырёх категорий (60/20/10/10) по шкале 0–100; двенадцать заголовков со своими весами (HSTS, CSP и строка Server по 15…), а не таблица Health Score; HSTS preload даёт 2 балла внутри HTTPS, а не 2 из 10 в блоке HSTS; пути .git/.env/debug не проверяются; буквы — A+ от 90, A от 80, B от 70, C от 55, D от 35, а не 50/45/38/30/20 из 55. Впервые описан сводный балл — он на /security с 2026-05-26. Изменения кода после публикации, которые двигают баллы: 2026-08-08 строка CSP оценивается только по script-src (default-src), а nonce или hash делают 'unsafe-inline' безвредным; 2026-10-04 X-Frame-Options засчитывается и по ограничивающей frame-ancestors любого действующего заголовка CSP (Report-Only не считается). 2026-05-25 включил запрос к списку HSTS preload, но в категории заголовков он показывается, а не оценивается. v1.0 (2026-05-05) — первая публикация.

Формула

score = round(60·H/100 + 20·T/Tmax + 10·C/Cmax + 10·D/Dmax)

H — категория заголовков (0–100), T — HTTPS, C — cookie, D — раскрытие информации, каждая делится на свой максимум. Все четыре считаются всегда.

1. Заголовки безопасности — 60 %

12 строк на 110 баллов; категория — round(набрано / 110 × 100). Частичные баллы — вес × коэффициент движка с округлением вниз. Отсутствующий заголовок даёт 0, если в его строке не сказано иное.

Заголовок — что сколько даётМакс.
Strict-Transport-Security: max-age ≥ 31536000 — 15; короче — 7; есть, но max-age=0 или без max-age — 4; заголовка нет — 015
Content-Security-Policy, по script-src (или default-src): без замечаний — 15; 'unsafe-eval' или http:-источник — 10; 'unsafe-inline' без nonce/hash или * — 6; нет ни одной из директив — 615
X-Frame-Options DENY/SAMEORIGIN или ограничивающая CSP frame-ancestors — 10; другое значение — 510
X-Content-Type-Options: nosniff — 10; другое значение — 310
Referrer-Policy: no-referrer, strict-origin(-when-cross-origin), same-origin, origin(-when-cross-origin), no-referrer-when-downgrade — 8; unsafe-url — 2; другое значение — 48
Permissions-Policy: любое значение8
X-XSS-Protection: 1… — 5; 0 при CSP — 5, без CSP — 2; другое значение — 1; нет заголовка при CSP — 3, без CSP — 05
Cross-Origin-Opener-Policy: same-origin(-allow-popups) — 7; другое значение — 37
Cross-Origin-Resource-Policy: same-origin, same-site, cross-origin — 7; другое значение — 37
Cross-Origin-Embedder-Policy: require-corp, credentialless — 6; другое значение — 36
X-DNS-Prefetch-Control: off — 4; другое значение или нет заголовка — 24
Раскрытие сервера: нет Server с версией (x.y) и нет X-Powered-By — 15; иначе — 615

Заголовки — здесь и в категории 4 — читаются из итогового ответа: проверка проходит по редиректам (до 5) и оценивает страницу, на которую попадает, а не сам редирект; промежуточные ответы 1xx (100 Continue, 103 Early Hints) пропускаются. Статус HSTS preload рядом с HSTS здесь — информация; баллы за него — в категории 2.

2. HTTPS — 20 %

  • 5 — итоговый адрес — HTTPS
  • 5 — http:// на порту 80 отвечает 3xx на https://-адрес; 3, если порт 80 не отвечает, а сайт на HTTPS; иначе 0
  • 2 — домен в списке HSTS preload (hstspreload.org); 1, если заявка подана; 0, если не в списке или запрос не удался. Строка есть только у HTTPS-сайта, поэтому максимум категории — 12 по HTTPS и 10 без него

3. Cookies — 10 %

  • 4 — у каждой cookie есть Secure (одна без него — 0)
  • 3 — у каждой есть HttpOnly; 1, если хоть у одной нет
  • 3 — у каждой есть SameSite (любое значение); 1, если хоть у одной нет

Нет cookie в ответах — 10 из 10. Cookie итоговой страницы учитываются всегда, на каком бы домене ни закончились редиректы. Cookie промежуточных редиректов — если редирект на проверяемом сайте (его хост с www и без и его поддомены): браузер сохраняет и их. Cookie, которую по дороге ставит чужой домен (SSO, CDN), и строки удаления (Max-Age ≤ 0, или Expires в прошлом, если Max-Age нет) не учитываются. Флаг ищется как слово в любом месте строки Set-Cookie.

4. Раскрытие информации — 10 %

  • 4 — нет заголовка Server; 3, если он называет сервер без версии; 0 — с версией
  • 3 — нет X-Powered-By
  • 3 — нет X-AspNet-Version / X-AspNetMvc-Version

Буквенная оценка

Security Grade, 0–100

БаллыОценка
90–100A+
80–89A
70–79B
55–69C
35–54D
0–34F

Сводный балл под оценкой

/security показывает и «Сводный security-балл» (0–100, A–F). Он берёт те же проверки, раскладывает их по названию в 9 категорий и даёт каждой её максимум × долю пройденных проверок (предупреждение — не пройдена). Считаются только категории, куда попала хоть одна проверка, и сумма приводится к 100: round(Σ round(max × пройдено/всего) / Σ max × 100). Буквы: A от 90, B от 75, C от 60, D от 40, F ниже.

Категория — что в неё попадает сейчасМакс.
Транспорт: HTTPS, HSTS, редирект, preload25
CSP20
Прочие заголовки (10 из 12 строк категории 1)15
Cookies10
«Exposed»: X-Powered-By и версия ASP.NET — когда они раскрыты10
Раскрытие: Server; X-Powered-By и ASP.NET — когда скрыты5
CORS5
SRI5
Смешанный контент5

В отчёте нет проверок CORS, SRI и смешанного контента, поэтому эти три категории сейчас не учитываются никогда. Категория выбирается по названию проверки, поэтому раскрытые X-Powered-By или версия ASP.NET попадают в «exposed», а скрытые — в «disclosure».

Сводный балл, 0–100

Где ещё показывается оценка «security»

Бейдж Security (/badges), публичный отчёт /report/{домен}/security и каталог «Проверено Enterno» считают облегчённую формулу из одного HEAD-запроса: баллы за каждый присутствующий заголовок — HSTS 20, CSP 20, X-Frame-Options 12, X-Content-Type-Options 12, Referrer-Policy 12, Permissions-Policy 12 — и ещё 12, если есть все шесть; не больше 100. Буквы бейджа: A от 90, B от 80, C от 70, D от 60, E от 50, F ниже.

MCP-инструмент check_security возвращает только категорию 1 (заголовки, 0–100) со своей буквой: A от 90, B от 75, C от 55, D от 35, F ниже.

Версионирование

Текущая версия — v1.2, обновлена . Каждое изменение опубликованной формулы — весов или их описания — новая версия со строкой в истории выше.

Запустить проверку безопасности →

Калькулятор

Задайте, что отдаёт сайт, — получите оценку и сводный балл по тем же правилам, что и проверка /security. Сеть калькулятор не трогает.

1. Заголовки безопасности
2. HTTPS
3. Cookies
Security Grade
--
A
Сводный балл
--
A


  
Проверить мой сайт →