Методология · Открытая формула
Методология Health Score v2.3
Открытая формула 0–100: шесть категорий, 120 «сырых» баллов, нормализация.
1. Заголовки безопасности — 30 баллов
| Заголовок | Вес |
|---|---|
| Strict-Transport-Security (HSTS) | 6 |
| Content-Security-Policy (действующая) | 6 |
| X-Content-Type-Options | 4 |
| X-Frame-Options или CSP frame-ancestors | 4 |
| Referrer-Policy | 3 |
| Permissions-Policy | 3 |
| X-XSS-Protection | 2 |
| Cross-Origin-Opener-Policy | 2 |
Заголовок, который есть в последнем ответе после всех редиректов, даёт полный вес; значение здесь не оценивается (сила политики CSP оценивается в категории 6). Заголовок Content-Security-Policy-Report-Only в этой строке не засчитывается. Строку X-Frame-Options закрывает и ограничивающая директива CSP frame-ancestors (v2.1).
2. SSL/TLS — 25 баллов
- 10 — сертификат действует: срок начался и не истёк, имя хоста есть в SAN (так, как проверяют браузеры, — методология SSL/TLS v1.2), до истечения больше 30 дней; 6, если осталось 30 дней или меньше; 0, если истёк, ещё не начался или выдан на другое имя
- 5 — имя хоста есть в SAN; CN не учитывается
- 5 — до истечения больше 30 дней; 3 при 8–30 днях; 0 при 7 и меньше
- 5 — соединение установлено по TLS 1.2 или TLS 1.3
Категория считается, только если итоговый адрес — HTTPS и TLS-проба ответила; иначе теряются все 25 баллов. Проба соединяется без проверки цепочки, поэтому ни цепочка доверия, ни отзыв (OCSP/CRL) на эти баллы не влияют — инструмент /ssl показывает их отдельно. Опорный стандарт: Mozilla Server-Side TLS Guidelines.
3. Производительность — 25 баллов
- 10 — время ответа меньше 500 мс; 7 — меньше 1000 мс; 4 — меньше 2000 мс; 0 — от 2000 мс
- 5 — ответ сжат (есть заголовок Content-Encoding)
- 5 — есть заголовок кэширования: Cache-Control, ETag или Expires
- 5 — отдельный запрос к адресу договаривается о HTTP/2 или HTTP/3
Время ответа — полное время запроса со всеми редиректами и загрузкой тела (до 2 МБ), измеренное с нашего сервера, а не TTFB. Размер страницы и число редиректов отдельно не оцениваются.
4. Практики — 20 баллов
- 5 — итоговый адрес — HTTPS
- 4 — нет ни Server, ни X-Powered-By; 2, если есть только Server; 0, если есть X-Powered-By
- 4 — итоговый ответ — 2xx
- 3 — есть заголовок Content-Type
- 4 — нет смешанного контента: в первых 200 КБ HTTPS-страницы нет src, href или action со ссылкой http:// (страница по HTTP не проверяется и эти баллы сохраняет)
5. Cookies — 10 баллов
- 4 — HttpOnly
- 4 — Secure
- 2 — SameSite со значением Strict, Lax или None
Каждый флаг даёт свой вес, умноженный на долю cookie первого ответа, у которых он есть, с округлением: две из трёх cookie с HttpOnly дают round(2/3 × 4) = 3. Сайт, который не ставит cookie в первом ответе, получает все 10.
6. CSP — 10 баллов
- 10 / 8 / 6 / 4 / 2 — CSP-политика с оценкой A / B / C / D / F
- 0 — политики Content-Security-Policy нет
Буква берётся из того же грейдера, что и отдельный CSP Analyzer (src/csp-analyze.php). Если действующей политики нет, оценивается Report-Only — с соответствующим замечанием.
Нормализация
Шесть категорий дают 120 «сырых» баллов. Публикуемый балл 0–100 — это round(raw / 120 × 100) с зажимом в 0–100.
Буквенная оценка
round(raw / 120 × 100)
| Баллы | Оценка |
|---|---|
| 95–100 | A+ |
| 85–94 | A |
| 70–84 | B |
| 50–69 | C |
| 30–49 | D |
| 0–29 | F |
Где ещё показывается «health»
Бейдж Health (/badges), публичный отчёт /report/{домен}/health и каталог «Проверено Enterno» показывают не этот балл, а облегчённый — из HEAD-запроса и TLS-рукопожатия: HTTPS отвечает 2xx/3xx — 40; каждый из шести заголовков (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) — 5; TLS-рукопожатие — 30; не больше 100. Буквы бейджа: A от 90, B от 80, C от 70, D от 60, E от 50, F ниже.
API /api/v3/health и /api/v4/health считают ту же формулу, что /health: тот же движок (src/health-score.php), то же число и та же буква для одного и того же ответа сайта, и с каждым баллом — methodology_version.
Источники
Версионирование
Текущая версия — v2.3, обновлена . Движок (src/health-score.php) возвращает ту же версию с каждым баллом, в поле methodology_version. Каждое изменение опубликованной формулы — весов или их описания — новая версия со строкой в истории выше.
Калькулятор
Отметьте, что отдаёт ваш сайт, — балл считается по тем же правилам, что и проверка /health. Сеть калькулятор не трогает: состояния вы задаёте сами.