Skip to main content
Bezpečnost portálu stojí na několika nezávislých pilířích. Každý chrání před jiným typem útoku.

Hesla

  • Algoritmus: bcrypt přes password_hash($pw, PASSWORD_DEFAULT).
  • Verifikace: password_verify.
  • Žádný plain text hesel není nikde uložen ani logován.
  • Změna hesla automaticky regeneruje session cookie.

Sessions

  • PHP sessions s file-based storage (default).
  • Cookie: HttpOnly, Secure (v produkci), SameSite=Lax.
  • Session ID se rotuje při loginu (session_regenerate_id(true)).
  • Tracking přes user_devices (SHA-256 cookie hash).

CSRF

src/Core/Security/CSRF.php generuje session-bound tokeny. Použité v:
  • Web formulářích (hidden field)
  • Mutating API endpointech (header X-CSRF-Token nebo body field)
Token je 32-znakový random, validní pro current session.
API z kontextu prohlížeče (frontend portálu) nutně CSRF používá. Externí klienti, kteří se autentizují přes API key (zatím neimplementováno), by ho potřebovat nemuseli.

Input sanitizace

src/Core/Security/InputSanitizer.php má funkce:
FunkceCo dělá
username($s)lowercase, only [a-z0-9._-], length check
email($s)RFC 5322 lite (filter_var)
url($s)https-only, no userinfo, no fragments mimo whitelist
json($s)decode + max depth check
text($s, $max)trim, length check, žádné kontrolní znaky
slug($s)lowercase, dashes

SQL Injection

Všechny dotazy přes PDO prepared statements. Žádný string concatenation. PDO emulation prepares je vypnutá:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

XSS

  • Output v PHP šablonách přes htmlspecialchars($value, ENT_QUOTES, 'UTF-8') (helper e()).
  • API odpovědi jsou JSON, takže XSS není vstupní vektor (ale klient musí escapovat sám).
  • Kontent zápisů se ukládá jako JSON struktura, vykresluje jako odstavce — žádný raw HTML.

Rate limiting

Rate limiting — default 30 / 60s. Citlivé endpointy (login, register) mají přísnější.

CSRF + path traversal pro anthem_gate.php

  • Vyžaduje aktivní session.
  • Path validuje: realpath() musí začínat na uploads/user/.
  • .. v cestě → 403.
  • Symlinky odmítá.

OAuth state

OAuth flow používá session-based ověření, plus do budoucna explicit state parametr s HMAC. Ochrana proti CSRF na OAuth callback URL.

Cron secret

cron.php přijme jen requesty s parametrem ?key=<cron_secret>. Klíč je 32-znakový random, uložen v app.json. Při úniku okamžitě rotujte.

Headers (doporučená produkce)

V .htaccess:
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Content Security Policy (CSP) je naplánovaná, ale ještě není zapnutá globálně — některé inline scripty by potřebovaly nonce.

Audit log

Klíčové akce (login, character.kill, faction.create, whitelist.review) se zapisují do user_activities. Slouží jak pro forenzní analýzu, tak pro user-facing aktivit feed.

Bezpečnostní reporting

Pokud najdete zranitelnost, neoznamujte ji veřejně. Kontakt: [email protected] nebo Discord admin (DM). Pokus o exfiltraci dat = ban + případné právní kroky.