Security
Reporting a vulnerability
Please report suspected vulnerabilities privately to henoriega@icf.unam.mx. Include the affected URL, reproduction steps, and potential impact. Do not include visitor records or exploit other visitors while testing.
Architecture
The public portfolio is a static Jekyll site on GitHub Pages. The public /calendar/ page is rendered from _data/calendar.json and requires no password. Visitor analytics are handled by a Cloudflare Worker backed by D1. The Worker’s legacy authenticated calendar API remains independent of the public page.
The Worker is the security boundary for private information. It uses strict origin checks, scoped short-lived bearer tokens, rate limiting, bounded JSON parsing, allowlisted event types and URLs, prepared SQL statements, defensive response headers, and no-store caching.
Full visitor IP storage is intentionally enabled. Access to those records is restricted to the authenticated analytics API and dashboard.
Operational requirements
- Keep Wrangler local state, D1 files,
.envfiles, and.dev.varsout of Git. - Keep
STATS_SECRETstable when IP-hash continuity is required. - Rotate
AUTH_SECRETto invalidate all dashboard and calendar sessions. - Use separate high-entropy values for
STATS_PASSWORDandCALENDAR_PASSWORDwhile the legacy calendar API is enabled. - Review Dependabot alerts and the scheduled security workflow.
- Only public calendar events belong in
_data/calendar.json. Do not put credentials, private event details, API tokens, or visitor data in the static site repository.