# 安全與邊界

Source: https://gortexa.sheng.page/examples/security/

## 03 security-probe — 拒絕路徑零洩漏

對抗性輸入打三協定，斷言所有錯誤 body 都不含內部細節。

```bash
# 無／壞／過期 token → 401 UNAUTHENTICATED
curl -H "authorization: Bearer xxx" http://localhost:18080/v1/resources        # 401

# evil origin → 回應不帶 Access-Control-Allow-Origin
curl -D - -H "Origin: https://evil.example" http://localhost:18080/v1/resources

# >1 MiB body 打 /mcp → 413，乾淨
curl -XPOST http://localhost:18080/mcp -H 'Content-Type: application/json' \
  --data-binary @big.json                                                       # 413

# 壞版號／未知 tool／超大 id／非 JSON → 結構化 JSON-RPC error，不 panic
curl -XPOST http://localhost:18080/mcp -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"no_such_tool","arguments":{}}}'
```

最後掃過所有拒絕 body：不得出現堆疊、內部路徑或未遮罩的原因。

## 06 config-matrix — JWT secret 啟動安全

placeholder 或過短的 secret 一律拒絕啟動（fail-loud），且錯誤訊息不回射 secret 本身。

```bash
GORTEXA_AUTH__JWT_SECRET="dev-only-insecure-secret-change-me-please" ./server   # exit 1，未綁 port
GORTEXA_AUTH__JWT_SECRET='tooshort' ./server                                    # exit 1
GORTEXA_AUTH__JWT_SECRET="<45-byte real secret>" ./server                       # 啟動；env 覆寫 file secret
```

拒絕發生在 listen 之前，所以 (a)(b) 兩例根本不會綁 port。

## 08 header-leak-probe — 回應 header allowlist

回應 header 侷限在固定 allowlist：不得漏 `Grpc-Metadata-*`，但 `X-Request-Id` 必須保留（allowlist 不能過窄）。

```bash
curl -D - -H "authorization: Bearer $TOK" http://localhost:18082/v1/resources/x
# 斷言：無 grpc-metadata-* 標頭、無 allowlist 外的標頭、X-Request-Id 有出現
```

## 09 reflection-probe — reflection 預設關、可 config 開

gRPC reflection 預設關閉；用環境變數開啟後同一呼叫才成功。

```bash
buf curl --protocol grpc --http2-prior-knowledge --reflect ...   # 預設：失敗（找不到 service）
GORTEXA_SERVER__REFLECTION=true ./server
buf curl --protocol grpc --http2-prior-knowledge --reflect ...   # 開啟後：成功
```

生產環境建議保持關閉，見[部署](https://gortexa.sheng.page/deployment/)的生產旗標。
