安全與邊界
03 security-probe — 拒絕路徑零洩漏
Section titled “03 security-probe — 拒絕路徑零洩漏”對抗性輸入打三協議,斷言所有錯誤 body 都不含內部細節。
# 無/壞/過期 token → 401 UNAUTHENTICATEDcurl -H "authorization: Bearer xxx" http://localhost:18080/v1/resources # 401
# evil origin → 回應不帶 Access-Control-Allow-Origincurl -D - -H "Origin: https://evil.example" http://localhost:18080/v1/resources
# >1MB 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,不 paniccurl -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 啟動安全
Section titled “06 config-matrix — JWT secret 啟動安全”placeholder 或過短的 secret 一律拒絕啟動(fail-loud),且錯誤訊息不回射 secret 本身。
GORTEXA_AUTH__JWT_SECRET="dev-only-insecure-secret-change-me-please" ./server # exit 1,未綁 portGORTEXA_AUTH__JWT_SECRET='tooshort' ./server # exit 1GORTEXA_AUTH__JWT_SECRET="<45-byte real secret>" ./server # 啟動;env 覆寫 file secret拒絕發生在 listen 之前,所以 (a)(b) 兩例根本不會綁 port。
08 header-leak-probe — 回應 header allowlist
Section titled “08 header-leak-probe — 回應 header allowlist”回應 header 侷限在固定 allowlist:不得漏 Grpc-Metadata-*,但 X-Request-Id 必須保留(allowlist 不能過窄)。
curl -D - -H "authorization: Bearer $TOK" http://localhost:18082/v1/resources/x# 斷言:無 grpc-metadata-* 標頭、無 allowlist 外的標頭、X-Request-Id 有出現09 reflection-probe — reflection 預設關、可 config 開
Section titled “09 reflection-probe — reflection 預設關、可 config 開”gRPC reflection 預設關閉;用環境變數開啟後同一呼叫才成功。
buf curl --protocol grpc --http2-prior-knowledge --reflect ... # 預設:失敗(找不到 service)GORTEXA_SERVER__REFLECTION=true ./serverbuf curl --protocol grpc --http2-prior-knowledge --reflect ... # 開啟後:成功生產環境建議保持關閉,見部署的生產旗標。