mirror of
https://github.com/Zproger/Aurum.git
synced 2026-10-13 02:56:39 +07:00
fix(security): stop granting every origin credentialed access to the API (#5)
`AURUM_CORS_ORIGINS` defaults to `*`, and the middleware was configured with
`allow_credentials=True`. Starlette does not answer that combination with a
literal `*` — it echoes back whatever `Origin` the caller sent and adds
`Access-Control-Allow-Credentials: true`, so any page open in the same
browser can call the instance, with the user's Basic Auth attached, and read
the response:
GET /api/accounts Origin: https://evil.example
-> Access-Control-Allow-Origin: https://evil.example
Access-Control-Allow-Credentials: true
That undercuts the README's advice that leaving Basic Auth off is fine while
the instance is only reachable from localhost: reachable-from-localhost
includes every website the user visits.
Nothing in the shipped setup is cross-origin. Compose serves the UI and the
API from the same nginx, and the Vite dev server proxies `/api`
(frontend/vite.config.ts), so neither deployment nor development needs CORS
at all. The default is therefore empty — no cross-origin access — and the
middleware is only installed when origins are configured deliberately.
An explicit `*` is still honoured for a genuinely public read-only setup, but
never together with credentials, which is what the spec intends `*` to mean
anyway.
This commit is contained in:
@@ -23,7 +23,7 @@ services:
|
||||
AURUM_POSTGRES_DB: ${AURUM_POSTGRES_DB:-aurum}
|
||||
AURUM_POSTGRES_HOST: db
|
||||
AURUM_POSTGRES_PORT: 5432
|
||||
AURUM_CORS_ORIGINS: ${AURUM_CORS_ORIGINS:-*}
|
||||
AURUM_CORS_ORIGINS: ${AURUM_CORS_ORIGINS:-}
|
||||
AURUM_DEFAULT_CURRENCY: ${AURUM_DEFAULT_CURRENCY:-USD}
|
||||
# Free CoinGecko Demo key (coingecko.com/en/api/pricing) — the Crypto
|
||||
# tab's price sync 400s with a clear message until this is set.
|
||||
|
||||
Reference in New Issue
Block a user