The preferred channel for confidential reports is GitHub’s Private vulnerability reporting feature. Open a private advisory from the repository’s Security tab and include:
- Affected version or commit SHA
- Environment details (PHP version, database, browser, etc.)
- Reproduction steps and expected vs. actual behavior
- Impact assessment and any proof-of-concept
- Whether details are already public and any disclosure timing requests
If the advisory system is unavailable, please fall back to the alternate contact listed in the Security settings.
- We aim to acknowledge new reports within 7 calendar days.
- Status updates are provided at least every 30 days while an issue is under investigation.
- Once confirmed, we work to deliver a fix or mitigation as quickly as possible, prioritizing critical issues. Coordinated disclosure timing will be agreed with the reporter before public release.
These timelines reflect a volunteer-run project; we’ll communicate sooner whenever we can.
| Version | Supported |
|---|---|
| Latest release (see CHANGELOG) | ✅ |
| Older releases | ❌ — may receive critical security patches at our discretion |
Good-faith security research is welcome. Please avoid impacting production players, respect rate limits, and do not access other users’ data. We will not pursue legal action for vulnerability testing performed within these bounds. Coordinate public disclosure with us so we can prepare a fix and notify the community.
With your permission, verified reporters are thanked in the release notes. The project does not operate a bug bounty or provide monetary rewards.
The application now applies a single runtime hardening bootstrap in common.php before session_start() to set secure session-cookie parameters and central HTTP response headers for HTML pages.
path=/HttpOnly=trueSecureautomatically enabled when HTTPS is detected (can be forced)SameSite=Laxby default (Strictis also supported)
- Session IDs are regenerated after successful authentication (
login.php). - Session IDs are also regenerated when superuser privileges increase during an active session (privilege elevation path).
X-Frame-Options: SAMEORIGIN(or optional CSPframe-ancestors)X-Content-Type-Options: nosniffReferrer-Policy: strict-origin-when-cross-originStrict-Transport-Securityonly when HTTPS is detected and explicitly enabled.
These keys are optional and allow phased rollout:
SESSION_COOKIE_PATH(default/)SESSION_COOKIE_DOMAIN(default empty)SESSION_COOKIE_SAMESITE(Lax,Strict, orNone; defaultLax)SESSION_COOKIE_SECURE_AUTO(defaulttrue)SESSION_COOKIE_SECURE_FORCE(defaultfalse)SECURITY_HEADERS_ENABLED(defaulttrue)SECURITY_FRAME_OPTIONS(defaultSAMEORIGIN)SECURITY_USE_CSP_FRAME_ANCESTORS(defaultfalse)SECURITY_CSP_FRAME_ANCESTORS(default'self')SECURITY_REFERRER_POLICY(defaultstrict-origin-when-cross-origin)SECURITY_HSTS_ENABLED(defaultfalse)SECURITY_HSTS_MAX_AGE(default31536000)SECURITY_HSTS_INCLUDE_SUBDOMAINS(defaultfalse)SECURITY_HSTS_PRELOAD(defaultfalse)SECURITY_TRUST_FORWARDED_PROTO(defaultfalse)SECURITY_TRUSTED_PROXIES(comma-separated IP allowlist, default empty)
- If you run behind a reverse proxy/load balancer, enable
SECURITY_TRUST_FORWARDED_PROTOand setSECURITY_TRUSTED_PROXIESso only trusted peers can influence HTTPS detection. - Do not enable
SameSite=Noneunless TLS is enforced andSecureis enabled. - Roll out HSTS carefully (start with low
max-age) and enable preload only after confirming all subdomains are HTTPS-ready.
When changing security-sensitive code paths, align implementation and review notes with these project references:
- Doctrine prepared statements baseline: docs/Doctrine.md#prepared-statements
- Async authentication and rate-limit guidance: AGENTS.md#async--jaxon and docs/PasskeyService.md#async-boundary
- Session, header, and cookie expectations: docs/PasskeyService.md#security-model-and-boundaries, UPGRADING.md#6-configuration-changes, and UPGRADING.md#8-after-upgrade