# Технічний, SEO та GEO-аудит STVORO 1.4.0

Дата перевірки: 5 серпня 2026 року.

## Підсумковий статус

Кодова база підготовлена до розгортання: PHP і JavaScript проходять синтаксичну перевірку, POST-форми містять CSRF, вбудовані стилі з PHP-шаблонів видалені, а публічні, приватні й адміністративні маршрути розділені.

Фінальний запуск усе одно потребує контрольного проходження на робочому HTTPS-домені з реальною MySQL/MariaDB, поштою, резервним копіюванням і заповненим каталогом. Юридичні сторінки технічно готові та автоматично підставляють реквізити, але їх відповідність конкретній моделі бізнесу має підтвердити юрист.

## Ключові зміни версії 1.4.0

- Повний ребрендинг у STVORO: інтерфейс, тексти, SEO, документи, installer, manifest і social cover.
- Додано власну серверну аналітику та окремий розділ в адмінці.
- Схему бази оновлено до версії 5.

1. Інсталятор вимагає реальний URL, службовий email, режим платформи й захищений пароль адміністратора.
2. Безкоштовний режим не вимагає окремої юридичної особи та не блокується через порожні реквізити ФОП; комерційний режим перевіряє їх повноту.
3. Контакти та наявні реквізити автоматично потрапляють у налаштування, футер, Organization schema і юридичні сторінки.
4. Політика конфіденційності та умови використання замінені повними динамічними документами без тестових попереджень.
5. Додано дату останньої перевірки виробництва в базу, адмінку, публічний профіль, sitemap і structured data.
6. Публікація виробництва перевіряє повноту опису, можливостей і категорій.
7. Категорія не зберігається без змістовного короткого й повного опису; SEO title та description мають контроль довжини.
8. Розширено Organization, WebSite, WebPage, Service і LocalBusiness JSON-LD.
9. Додано `hreflang`, manifest, повний Open Graph/Twitter набір і `noindex` для 404.
10. Кабінет, адмінка та приватні файли отримали `Cache-Control: no-store`.
11. CSRF-токен змінюється після входу, реєстрації, 2FA та зміни пароля.
12. CSP більше не потребує `unsafe-inline`; upgrade insecure requests вмикається лише на HTTPS.
13. Виправлено drag-and-drop: передані файли реально потрапляють у file input.
14. Рендеринг назв вибраних файлів більше не використовує `innerHTML`.
15. У шаблонах прибрані вбудовані стилі, а дрібний службовий текст збільшений до читабельного розміру.
16. Додані skip links, `focus-visible`, коректні label/id, `aria-current`, стани помилок і reduced motion.
17. Manifest працює і в корені домену, і в підкаталозі.
18. Службові файли й каталоги закриті правилами `.htaccess`.
19. Додано автоматичну міграцію схеми до версії 5 з ребрендингом і таблицею аналітики.

## Кабінет замовника

Перевірено на рівні коду:

- реєстрацію, вхід, вихід і тимчасове блокування після невдалих спроб;
- список власних заявок та непрочитаних повідомлень;
- перевірку належності заявки й файла поточному замовнику;
- приватне завантаження вкладень без прямої URL-видачі;
- відповіді виробництв і діалог з адміністратором;
- профіль і зміну пароля;
- прив’язку попередньої заявки за номером, кодом і email;
- `noindex` та заборону кешування всіх приватних сторінок.

## SEO

### Реалізовано

- унікальні title та description для основних типів сторінок;
- canonical для звичайних сторінок і пагінації;
- `noindex,follow` для фільтрованих URL і 404;
- `noindex,nofollow,noarchive` для кабінету й адмінки;
- XML sitemap із `lastmod` для категорій, профілів і реальних сторінок послуга–місто;
- robots.txt із посиланням на sitemap;
- читабельні URL і навігаційні крихти;
- Organization, WebSite, WebPage, BreadcrumbList, Service і LocalBusiness JSON-LD;
- legal name, identifier, регіон, послуги, обладнання, матеріали та дата перевірки профілю;
- Open Graph, Twitter Card, favicon і manifest;
- `uk-UA` та `hreflang`;
- контроль якості SEO-полів у панелі адміністратора.

### Перевірити після публікації

- HTTPS і єдиний варіант домену;
- canonical та sitemap на робочій адресі;
- Google Search Console і статус індексації;
- Rich Results Test для профілів і breadcrumbs;
- PageSpeed Insights та польові Core Web Vitals;
- коди відповіді 200/301/404, кешування CDN і стиснення;
- унікальність реального контенту категорій і профілів.

## GEO / видимість у генеративному пошуку

Архітектура орієнтована на чіткі фактичні сутності, а не на масове генерування тексту:

- кожне виробництво має назву, юридичні й контактні дані, географію, категорії, матеріали, обладнання та умови роботи;
- профіль показує дату перевірки;
- послуги й міста пов’язані з реально опублікованими компаніями;
- сторінки містять конкретні відповіді на практичні виробничі запити;
- структуровані дані дублюють видимі користувачеві факти;
- порожні сторінки та фільтри не відправляються на індексацію.

Для подальшого розвитку варто додавати перевірені технічні дані: робоче поле верстата, точність і допуски, матеріали й марки, мінімальну партію, формати креслень, сертифікати, контроль якості, приклади виконаних задач, географію доставки та джерело підтвердження даних.

## Безпека

Статично перевірено:

- CSRF у знайдених POST-формах;
- prepared statements для введених користувачем значень;
- whitelist для динамічної назви таблиці rate limit;
- password API, rate limit і блокування входу;
- ротацію session ID і CSRF;
- HttpOnly, SameSite та Secure cookie на HTTPS;
- CSP без `unsafe-inline`, HSTS на HTTPS, frame protection і Permissions Policy;
- контроль розширення, MIME, розміру та кількості вкладень;
- випадкові імена файлів і точну перевірку шляху перед видачею;
- заборону виконання PHP в uploads і прямого доступу до private storage;
- шифрування Telegram token і одноразові 2FA-коди;
- журнал дій адміністратора.

## Виконані автоматичні перевірки

- PHP lint для всіх PHP-файлів;
- JavaScript syntax check;
- баланс CSS-блоків;
- відсутність inline `style` у PHP-шаблонах;
- відсутність тестового публічного contact email;
- наявність CSRF у POST-формах шаблонів;
- `git diff --check`;
- статичний браузерний рендер ключових екранів без MySQL.

## Межі перевірки

У середовищі аудиту відсутнє розширення `pdo_mysql` і сервер MySQL, тому повний інтеграційний сценарій зі створенням, читанням і міграцією реальної бази тут не виконувався. Його потрібно пройти після розгортання за `LAUNCH_CHECKLIST.md`.

## Режим безкоштовного запуску 1.4.0

Публічні сторінки, умови та верхня панель узгоджені з моделлю без приймання оплати платформою. Structured data не вигадує `legalName` або ідентифікатор: ці поля додаються лише після фактичного заповнення в адмінці. Це безпечніше для SEO/GEO, ніж публікація тестових або недостовірних реквізитів.
