HIGH data exposurefastapiapi keys

Data Exposure in Fastapi with Api Keys

Data Exposure in Fastapi with Api Keys

Data exposure in FastAPI when using API keys commonly arises from how keys are transmitted, stored, and validated. Because API keys are often bearer-style credentials, they can leak through logs, browser history, or insecure transport if not strictly enforced. In FastAPI, a developer might define an API key scheme using HTTPBearer but inadvertently allow keys to be passed in query parameters, which can be stored in server logs or browser history and increase the risk of unauthorized data access.

Another common pattern is reading the API key from environment variables and comparing it directly without constant-time comparison, which can expose timing information and aid inference attacks. If route or dependency scopes are too broad, a valid API key might grant access to endpoints that should be restricted, leading to inadvertent data exposure across authenticated routes. Middleware or global dependencies that do not properly skip OpenAPI routes intended for unauthenticated introspection (such as health checks) can also expose metadata that, when combined with a leaked key, increases the attack surface.

FastAPI’s dependency injection system is powerful but requires careful scoping. For example, attaching a key-verification dependency to a router that also serves public documentation or error-handling paths can inadvertently expose sensitive data if errors reveal stack traces or internal details when a key is missing or malformed. Similarly, if responses include detailed debugging information in production mode, a valid key paired with an endpoint misconfiguration may return more data than intended, such as full database records or internal identifiers.

When using OpenAPI generation, API key locations (e.g., in headers) must be explicitly declared; mismatches between the declared location and the actual enforcement point can cause the framework to accept keys in less-secure venues (e.g., query strings), which are more likely to be leaked. Even with HTTPS, insecure handling on the server side—such as printing headers or writing keys to stdout—can result in data exposure through logs or monitoring tools.

In practice, a secure approach in FastAPI combines strict transport enforcement, precise dependency scoping, and careful OpenAPI configuration. By ensuring API keys are only accepted in headers, applying least-privilege access per route, and sanitizing error outputs, you reduce the likelihood that a valid key leads to unintended data exposure across endpoints.

Api Keys-Specific Remediation in Fastapi

To remediate data exposure risks specific to API keys in FastAPI, implement strict header-only transmission, constant-time comparison, and narrow dependency scopes. Below are concrete examples that demonstrate secure patterns.

1. Enforce API keys in headers only

Use HTTPBearer and ensure the key is provided in the Authorization header, not in query parameters. Configure OpenAPI to reflect this explicitly.

from fastapi import FastAPI, Depends, HTTPException, Security
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
import secrets

app = FastAPI()
security_scheme = HTTPBearer()

# Secure in-memory key store (use secrets manager in production)
VALID_API_KEY = secrets.token_urlsafe(32)

def verify_api_key(credentials: HTTPAuthorizationCredentials = Security(security_scheme)):
    if credentials.scheme != "Bearer":
        raise HTTPException(status_code=401, detail="Invalid authentication scheme")
    # Constant-time comparison to mitigate timing attacks
    if not secrets.compare_digest(credentials.credentials, VALID_API_KEY):
        raise HTTPException(status_code=403, detail="Invalid API key")
    return credentials.credentials

@app.get("/secure-data")
def read_secure_data(api_key: str = Depends(verify_api_key)):
    return {"data": "sensitive information", "scope": "authorized-only"}

2. Scope dependencies to least privilege

Attach the key-verification dependency only to routes that require it, and avoid applying it globally unless necessary. This prevents broad exposure and unintended access.

from fastapi import APIRouter, Depends

router = APIRouter()

@router.get("/admin/users")
def list_users(api_key: str = Depends(verify_api_key)):
    return {"users": ["alice", "bob"]}

@router.get("/public/info")
def public_info():
    return {"info": "no key required"}

app.include_router(router, prefix="/api")

3. Secure OpenAPI generation and hide keys from docs

Ensure the security scheme is properly declared and that the API key is not shown in example values within the generated schema.

from fastapi.openapi.utils import get_openapi

def custom_openapi():
    if app.openapi_schema:
        return app.openapi_schema
    openapi_schema = get_openapi(
        title="Secure API",
        version="1.0.0",
        routes=app.routes,
    )
    # Explicitly set security requirement to header-only Bearer
    openapi_schema["components"]["securitySchemes"] = {
        "ApiKeyAuth": {
            "type": "http",
            "scheme": "bearer",
            "bearerFormat": "ApiKey",
        }
    }
    for path in openapi_schema["paths"].values():
        for method in path.values():
            method.setdefault("security", [{"ApiKeyAuth": []}])
    app.openapi_schema = openapi_schema
    return app.openapi_schema

app.openapi = custom_openapi

4. Avoid logging or exposing keys

Ensure that request or dependency code does not print or serialize headers containing the API key. Validate that error messages do not include raw credentials.

import logging
logger = logging.getLogger("secure_api")

@app.middleware("http")
async def hide_key_from_logs(request, call_next):
    # Do not log headers that may contain the API key
    response = await call_next(request)
    return response

By combining header-only transmission, constant-time validation, scoped dependencies, and secure OpenAPI configuration, you reduce the avenues through which API keys can be inadvertently exposed, thereby mitigating data exposure risks in FastAPI services.

Related CWEs: dataExposure

CWE IDNameSeverity
CWE-200Exposure of Sensitive Information HIGH
CWE-209Error Information Disclosure MEDIUM
CWE-213Exposure of Sensitive Information Due to Incompatible Policies HIGH
CWE-215Insertion of Sensitive Information Into Debugging Code MEDIUM
CWE-312Cleartext Storage of Sensitive Information HIGH
CWE-359Exposure of Private Personal Information (PII) HIGH
CWE-522Insufficiently Protected Credentials CRITICAL
CWE-532Insertion of Sensitive Information into Log File MEDIUM
CWE-538Insertion of Sensitive Information into Externally-Accessible File HIGH
CWE-540Inclusion of Sensitive Information in Source Code HIGH

Frequently Asked Questions

Can API keys be safely passed as query parameters in FastAPI?
No. Passing API keys as query parameters increases exposure risk because they can be logged in server logs, browser history, and proxy caches. Use HTTP headers (Authorization: Bearer ) instead to keep keys out of logs and URLs.
How does middleBrick assess API key handling in FastAPI scans?
middleBrick checks whether API keys are transmitted in insecure venues (e.g., query parameters), whether error responses leak sensitive details, and whether OpenAPI declarations align with actual enforcement points. Findings highlight exposure pathways and provide remediation guidance consistent with secure key handling practices.