# IQON Phase 1 Hardening Package Purpose: локальный пакет временного hardening для live WordPress `iqon.com` до полноценного редизайна или статической замены. ## Contents - [Scope](#scope) - [Files](#files) - [Install Draft](#install-draft) - [Hosting Rule Draft](#hosting-rule-draft) - [Automated Verification Script](#automated-verification-script) - [Verification](#verification) - [Rollback](#rollback) - [Limits](#limits) ## Scope Пакет не был установлен на live-сайт. Он подготовлен как reversible snippet для Code Snippets и должен применяться только после отдельного подтверждения на запись во внешний WordPress. ## Files | File | Role | |------|------| | `wp-snippets/iqon-phase1-hardening.php` | PHP snippet for Code Snippets, "Run snippet everywhere" | | `wp-snippets/hosting-rules.md` | nginx/Apache/file-level drafts for install docs and XML-RPC | | `scripts/iqon-phase1-verify.sh` | Post-activation verification script | ## Install Draft 1. Открыть WordPress admin через текущий безопасный маршрут доступа. 2. Создать новый snippet с названием `IQON Phase 1 hardening`. 3. Вставить содержимое `wp-snippets/iqon-phase1-hardening.php`. 4. Выбрать режим `Run snippet everywhere`. 5. Сохранить snippet как inactive draft. 6. Сделать свежий backup файлов и базы перед активацией. 7. Активировать snippet. 8. Сразу выполнить проверки из раздела Verification. ## Hosting Rule Draft PHP snippet не гарантирует блокировку физических файлов, которые веб-сервер отдаёт до WordPress. Для `readme.html` и `license.html` нужен server-level блок или удаление файлов. nginx draft: ```nginx location ~* ^/(readme|license)\.html$ { return 404; } ``` Если на reg.ru shared hosting нет доступа к nginx-конфигу, проверить доступные механизмы: панель хостинга, `.htaccess`, файловый менеджер или удаление публичных install-doc файлов после backup. Detailed drafts are in `wp-snippets/hosting-rules.md`. ## Automated Verification Script After activation: ```bash scripts/iqon-phase1-verify.sh https://iqon.com ``` Expected signal: final line is `[OK] iqon Phase 1 verification passed for https://iqon.com`. ## Verification Run after activation: ```bash curl -I -L https://iqon.com/ ``` Expected signal: response includes `X-Content-Type-Options`, `X-Frame-Options`, `Referrer-Policy`, `Permissions-Policy`, and `Content-Security-Policy`. ```bash curl -sS https://iqon.com/wp-json/wp/v2/users ``` Expected signal: no public list of usernames is returned. ```bash curl -sS https://iqon.com/ | rg 'http://www\.iqon\.com|http://iqon\.com|http://maps\.google\.com' ``` Expected signal: no output. ```bash curl -sS https://iqon.com/ | rg 'name="viewport"|iqon-skip-link|og:site_name' ``` Expected signal: viewport exists, skip link exists, site metadata no longer shows `- IQON`. ```bash curl -I -L https://iqon.com/readme.html ``` Expected signal after hosting rule: `403` or `404`. If it still returns `200`, WordPress snippet is bypassed by static file serving and hosting-level action is still required. ```bash curl -I --http1.1 https://iqon.com/xmlrpc.php ``` Expected signal: no usable XML-RPC behavior. A stronger check is a safe XML-RPC POST from a test client after confirming no production integrations depend on it. ## Rollback 1. Disable the `IQON Phase 1 hardening` snippet. 2. Clear any page/cache layer if present. 3. Re-run the same curl checks and compare before/after. 4. Remove hosting rule only if it caused a confirmed false positive. ## Limits - This package does not replace the contact form or legacy CAPTCHA. - This package does not fix duplicate sitemap URLs. - This package does not modernize the WordPress theme. - This package does not verify canonical contact data. - This package does not confirm the exact WordPress core version. --- *Created: 20 May 2026* *Updated: 20 May 2026*