| Version | Supported |
|---|---|
| main | ✅ |
- Authentication — session-based. The password is compared with
hash_equals()(timing-safe) and stored as a constant inadmin-config.php, which is git-ignored and outside version control. - Backups —
write_data()snapshotsdata.jsontobackups/before every save (last 5 kept), so a bad edit is always one restore away. - Output escaping — all admin-side output passes through
htmlspecialchars()(h()helper). Frontend rendering escapes with a dedicatedesc()before injecting into the DOM. - File uploads — the CV upload accepts PDF only (
accept+ MIME check on the client) and writes to a fixed filename (cv.pdf), preventing path traversal.
- Change
ADMIN_PASS— never deploy the sample password. - Serve over HTTPS only.
- Deny web access to
backups/andadmin-config.php(web-server rules or placement outside the docroot). - Keep
admin-config.phpout of git (already in.gitignore). - Restrict
admin.phpwith basic auth or an IP allowlist if exposed publicly.
Open an issue, or reach out via the GitHub profile. Please do not disclose vulnerabilities publicly before a fix is released.