Skip to content

Commit 05769d5

Browse files
NateIsernclaude
andcommitted
docs: changelog 0.3.3 (proxy trust, peer redaction, price-history query)
Document the merged hardening PRs and bump version: - restrict trusted proxy headers via TRUSTED_PROXY_CIDRS (#16) - redact public peer topology from /api/peers (#17) - single bounded price-history query (no findOne fan-out) (#15) Also note the TRUSTED_PROXY_CIDRS deployment requirement in the README. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent ee6a374 commit 05769d5

3 files changed

Lines changed: 23 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@ All notable changes to the FairCoin Explorer are documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.3.3] - 2026-06-25
9+
10+
### Security
11+
12+
- **Restrict trusted proxy headers.** `X-Forwarded-*` is now trusted only when the
13+
direct TCP peer is an explicitly configured proxy (`TRUSTED_PROXY_CIDRS`), instead
14+
of a blind single-hop trust, so a direct client cannot spoof its IP and bypass the
15+
per-IP rate limiter. The WebSocket per-IP cap uses the same trust decision (#16).
16+
- **Redact public peer topology.** `GET /api/peers` no longer exposes raw peer
17+
addresses, client versions, or per-peer metadata (#17).
18+
19+
### Changed
20+
21+
- **Price history sampling is a single bounded query.** `fetchBoundedPriceHistory`
22+
loads the (two-tier-pruned, bounded) point set once and thins it in memory,
23+
removing the per-request `findOne` fan-out introduced earlier (#15).
24+
25+
[0.3.3]: https://github.com/FairCoinOfficial/Explorer/releases/tag/v0.3.3
26+
827
## [0.3.2] - 2026-06-25
928

1029
### Security

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ WEBSOCKET_MAX_CONNECTIONS_PER_IP=5
7070
PUBLIC_BASE_URL=https://explorer.fairco.in
7171
```
7272

73-
**Security**: RPC credentials are only read server-side; all RPC calls are proxied through the API. The `/api` surface is rate-limited (a global limiter on `/api`, plus stricter limits on `/api/search`, `/api/tx/broadcast`, and the public `/mcp` endpoint, which can drive daemon-backed wallet tools). Expensive lookups are bounded: `/api/price/history` samples long windows with indexed queries instead of full-range scans, and `/api/search` on an address returns balance only (it no longer triggers an unbounded address-txid scan, so `txCount` is `0` there — use the address pages for full history).
73+
**Security**: RPC credentials are only read server-side; all RPC calls are proxied through the API. The `/api` surface is rate-limited (a global limiter on `/api`, plus stricter limits on `/api/search`, `/api/transaction`, `/api/address`, `/api/tx/broadcast`, and the public `/mcp` endpoint, which can drive daemon-backed wallet tools). Expensive lookups are bounded: `/api/price/history` samples long windows in memory from a bounded, two-tier-pruned series, and `/api/search` on an address returns balance only (it no longer triggers an unbounded address-txid scan, so `txCount` is `0` there — use the address pages for full history). `/api/peers` is redacted (no raw peer addresses or topology).
74+
75+
Behind a reverse proxy (e.g. nginx/Cloudflare), set `TRUSTED_PROXY_CIDRS` to the proxy's IP/CIDR(s) so the rate limiter keys on the real client IP — `X-Forwarded-For` is trusted **only** from those peers, never from arbitrary clients. Leave it blank when the API is reached directly.
7476

7577
## API overview
7678

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "faircoin-explorer",
33
"private": true,
4-
"version": "0.3.2",
4+
"version": "0.3.3",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

0 commit comments

Comments
 (0)