Initial commit: AzerothCore registration site

PHP registration page for AzerothCore with SRP6 salt/verifier generation,
Cloudflare Turnstile + honeypot + rate limiting anti-spam, and a WoW-themed
landing page with client setup instructions.
This commit is contained in:
2026-08-05 11:41:24 +02:00
commit 2b9a673912
19 changed files with 1294 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
# Registrace účtů — AzerothCore
Jednoduchá PHP registrační stránka pro AzerothCore server. Vytváří účet
přímo v `acore_auth`.`account` tabulce se správně spočítaným SRP6
salt/verifierem, takže se hráč může rovnou přihlásit ve hře.
## Ochrana proti spamu/botům
- **Cloudflare Turnstile** — captcha ověřená server-side (volitelná: pokud
necháš `TURNSTILE_SITE_KEY`/`TURNSTILE_SECRET_KEY` prázdné, widget se
nezobrazí a ověření se přeskočí — pro produkci ale doporučuji vyplnit).
- **Honeypot pole** — skryté pole `website`, které boti často vyplní;
formulář pak předstírá úspěch, ale nic se nezapíše.
- **Rate limiting** — max. N registračních pokusů z jedné IP za časové
okno (výchozí 5 / hodinu), ukládá se do lokální SQLite (`data/ratelimit.sqlite`),
nezasahuje do AzerothCore databáze.
- **CSRF token** na formuláři.
## Požadavky na serveru
- PHP 8.1+
- PHP rozšíření: `pdo_mysql`, `pdo_sqlite`, `gmp`, `session`, `openssl`
- Webserver (Apache s `mod_php`/PHP-FPM, nebo nginx + PHP-FPM)
- Síťový/lokální přístup k MySQL, kde běží `acore_auth`
## Instalace
1. Zkopíruj `.env.example` do `.env` a vyplň:
- `DB_HOST`, `DB_PORT`, `DB_DATABASE` (typicky `acore_auth`), `DB_USERNAME`, `DB_PASSWORD`
- `TURNSTILE_SITE_KEY` / `TURNSTILE_SECRET_KEY` z Cloudflare dashboardu
2. Vytvoř v MySQL **dedikovaného uživatele** jen s právy na tabulku `account`
(neházej tam root přístup):
```sql
CREATE USER 'acore_reg'@'localhost' IDENTIFIED BY 'silne-nahodne-heslo';
GRANT SELECT, INSERT ON acore_auth.account TO 'acore_reg'@'localhost';
FLUSH PRIVILEGES;
```
3. Nastav webserver tak, aby **DocumentRoot mířil na `public/`**, ne na kořen
projektu — `includes/`, `data/` a `.env` tak nebudou z webu dostupné vůbec.
Příklad Apache vhost:
```apache
<VirtualHost *:443>
ServerName registrace.tvuj-server.cz
DocumentRoot /cesta/k/wowserver-registrace/public
<Directory /cesta/k/wowserver-registrace/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
```
4. Uprav práva zápisu na `data/` (potřebuje tam vzniknout `ratelimit.sqlite`):
```bash
chown -R www-data:www-data data
chmod 750 data
```
5. Ověř, že GMP na serveru počítá SRP6 verifier správně (porovná se s
nezávisle spočítanou referenční hodnotou):
```bash
php includes/srp6_selftest.php
```
Očekávaný výstup je `OK - shoduje se s referenční implementací.` Pokud
vypíše chybu, něco je špatně s PHP/GMP na serveru a registrace by
vytvářela účty, se kterými se nepůjde přihlásit — než to nespadne,
dál nepokračuj.
6. Otevři stránku v prohlížeči, vyzkoušej registraci, ověř že se v `account`
tabulce objevil nový řádek a že se přihlásíš herním klientem.
## Poznámky k herním pravidlům
- Uživatelské jméno i heslo se před výpočtem SRP6 verifieru převádí na
velká písmena (`strtoupper`) a jméno se tak i ukládá — přesně jak to dělá
samotný AzerothCore/klient, aby přihlášení fungovalo case-insensitive.
- Heslo je omezené na tisknutelná ASCII znaky (`REG_PASSWORD_MIN/MAX` v `.env`,
výchozí 816 znaků) — WoW klient jiné znaky v hesle nepodporuje.
- `expansion`, `locale` a další sloupce tabulky `account` se nechávají na
výchozích hodnotách definovaných v DB schématu AzerothCore — uprav
`public/register.php`, pokud chceš nový účet zařadit jinak (např. jiný expansion level).
- Pokud web neběží přímo na stejném stroji jako MySQL, zvaž TLS pro DB
spojení nebo tunelování (SSH tunel / VPN), ať heslo/verifier neputuje po síti čistě.
## Struktura projektu
```
includes/ # PHP logika mimo webroot (DB, SRP6, Turnstile, rate limiter)
public/ # webroot — index.php (formulář), register.php (zpracování)
data/ # SQLite pro rate limiting (zapisovatelné webserverem)
.env # tajné údaje, needituj do gitu
```