|
1 | | -# Security |
| 1 | +# Security Policy |
2 | 2 |
|
3 | | -If `GOOGLE_API_KEY` or `GOOGLE_CSE_ID` were ever committed or shared, **revoke and recreate** them in [Google Cloud Console](https://console.cloud.google.com/apis/credentials). Store new values only in `backend/.env` and GitHub Actions secrets (see `.github/SECRETS.md`). |
| 3 | +Global Opportunities (globalopportunities.app) is a single-operator project, not a |
| 4 | +company with a security team. This policy is scoped and worded accordingly. |
| 5 | + |
| 6 | +## Reporting a vulnerability |
| 7 | + |
| 8 | +Preferred: use GitHub's private vulnerability reporting for this repo |
| 9 | +(Settings → Security → "Private vulnerability reporting", or the |
| 10 | +"Report a vulnerability" button under the Security tab). This opens a |
| 11 | +private advisory only the maintainer can see. |
| 12 | + |
| 13 | +If that option isn't available to you, email **hello@globalopportunities.app** |
| 14 | +with: |
| 15 | + |
| 16 | +- a description of the issue and its impact |
| 17 | +- steps to reproduce (or a PoC) |
| 18 | +- any relevant URLs, request/response examples, or logs |
| 19 | + |
| 20 | +Do not open a public GitHub issue for a security report. |
| 21 | + |
| 22 | +## Scope |
| 23 | + |
| 24 | +**In scope:** |
| 25 | + |
| 26 | +- The live site and API at globalopportunities.app |
| 27 | +- The source in this repository (`backend/` FastAPI app, `frontend/` static UI) |
| 28 | + |
| 29 | +**Out of scope:** |
| 30 | + |
| 31 | +- The infrastructure providers this app runs on — Render (hosting), |
| 32 | + Cloudflare (Workers/DNS), Neon (Postgres), and any transactional email |
| 33 | + provider (Resend/Brevo/SendGrid). Vulnerabilities in those platforms |
| 34 | + themselves belong to their own disclosure programs, not this repo. |
| 35 | +- Third-party content ingested by the scraper (RSS feeds, search results, |
| 36 | + listing pages on other sites). Report those to the source site. |
| 37 | +- Denial of service achieved purely by consuming the app's own rate limits |
| 38 | + as intended (see below). |
| 39 | + |
| 40 | +## What not to do |
| 41 | + |
| 42 | +- No automated scanning, fuzzing, or load testing against the live site. |
| 43 | + It's a small deployment and this can degrade it for other users. |
| 44 | +- In particular, don't script or hammer the public "Find new" button |
| 45 | + (`POST /api/v1/scraper/run`). It triggers a real scraping job against |
| 46 | + metered/rate-limited third-party search APIs and is protected by a |
| 47 | + 5-minute global cooldown (`backend/app/routes/scraper.py`) — treat that |
| 48 | + cooldown as a hard limit, not a target to test. |
| 49 | +- No accessing, modifying, or exfiltrating other users' data beyond what's |
| 50 | + needed to demonstrate a finding. |
| 51 | +- No public disclosure until a fix has shipped. Please give reasonable time |
| 52 | + to respond before going public. |
| 53 | + |
| 54 | +## Response expectations |
| 55 | + |
| 56 | +This project is maintained by one person in their spare time, not a 24/7 |
| 57 | +security team. Expect a best-effort acknowledgment within a few days, not a |
| 58 | +guaranteed SLA. Fix timelines depend on severity and available time — you'll |
| 59 | +be kept informed once a report is triaged. |
| 60 | + |
| 61 | +## Credentials and committed secrets |
| 62 | + |
| 63 | +If you find a committed secret (API key, token, connection string) in this |
| 64 | +repo's history, report it the same way as a vulnerability. As a past |
| 65 | +example: if `GOOGLE_API_KEY` or `GOOGLE_CSE_ID` are ever exposed (committed, |
| 66 | +logged, or otherwise leaked), they should be revoked and recreated |
| 67 | +immediately in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials), |
| 68 | +with new values stored only in `backend/.env` and GitHub Actions secrets |
| 69 | +(see `.github/SECRETS.md`) — never in the repo itself. The same applies to |
| 70 | +any other API key or credential used by this project (Resend/Brevo/SendGrid |
| 71 | +keys, `DATABASE_URL`, etc.). |
0 commit comments