Методология · Открытая формула
Методология Security Grade v1.2
Открытая формула 0–100: четыре взвешенные категории и сводный балл под ней.
Формула
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; заголовка нет — 0 | 15 |
| Content-Security-Policy, по script-src (или default-src): без замечаний — 15; 'unsafe-eval' или http:-источник — 10; 'unsafe-inline' без nonce/hash или * — 6; нет ни одной из директив — 6 | 15 |
| X-Frame-Options DENY/SAMEORIGIN или ограничивающая CSP frame-ancestors — 10; другое значение — 5 | 10 |
| X-Content-Type-Options: nosniff — 10; другое значение — 3 | 10 |
| Referrer-Policy: no-referrer, strict-origin(-when-cross-origin), same-origin, origin(-when-cross-origin), no-referrer-when-downgrade — 8; unsafe-url — 2; другое значение — 4 | 8 |
| Permissions-Policy: любое значение | 8 |
| X-XSS-Protection: 1… — 5; 0 при CSP — 5, без CSP — 2; другое значение — 1; нет заголовка при CSP — 3, без CSP — 0 | 5 |
| Cross-Origin-Opener-Policy: same-origin(-allow-popups) — 7; другое значение — 3 | 7 |
| Cross-Origin-Resource-Policy: same-origin, same-site, cross-origin — 7; другое значение — 3 | 7 |
| Cross-Origin-Embedder-Policy: require-corp, credentialless — 6; другое значение — 3 | 6 |
| X-DNS-Prefetch-Control: off — 4; другое значение или нет заголовка — 2 | 4 |
| Раскрытие сервера: нет Server с версией (x.y) и нет X-Powered-By — 15; иначе — 6 | 15 |
Заголовки — здесь и в категории 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–100 | A+ |
| 80–89 | A |
| 70–79 | B |
| 55–69 | C |
| 35–54 | D |
| 0–34 | F |
Сводный балл под оценкой
/security показывает и «Сводный security-балл» (0–100, A–F). Он берёт те же проверки, раскладывает их по названию в 9 категорий и даёт каждой её максимум × долю пройденных проверок (предупреждение — не пройдена). Считаются только категории, куда попала хоть одна проверка, и сумма приводится к 100: round(Σ round(max × пройдено/всего) / Σ max × 100). Буквы: A от 90, B от 75, C от 60, D от 40, F ниже.
| Категория — что в неё попадает сейчас | Макс. |
|---|---|
| Транспорт: HTTPS, HSTS, редирект, preload | 25 |
| CSP | 20 |
| Прочие заголовки (10 из 12 строк категории 1) | 15 |
| Cookies | 10 |
| «Exposed»: X-Powered-By и версия ASP.NET — когда они раскрыты | 10 |
| Раскрытие: Server; X-Powered-By и ASP.NET — когда скрыты | 5 |
| CORS | 5 |
| SRI | 5 |
| Смешанный контент | 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. Сеть калькулятор не трогает.