primedefender-fastapi
PrimeDefender adds a security layer to FastAPI applications: it inspects incoming requests for common attack patterns, optionally blocks them, and sends structured incidents to your PrimeDefender bridge (for example for a live monitoring map).
This package publishes to PyPI as primedefender-fastapi. The import name is primedefender_fastapi.
Features
| Detection | Notes |
|---|---|
| SQL injection | Signature-based |
| XSS | Signature-based |
| Brute force | Configurable window on auth paths |
| Path traversal | Signature-based |
| Command injection | Signature-based |
| File inclusion | Signature-based |
| DDoS / flood | Per-IP sliding window |
| Bot activity | User-agent heuristics + rate limit |
| Scanner | UA + path probes + rate limit |
| Suspicious request | Method / query / body heuristics (observe by default) |
| Auth bypass probe | Header / query patterns (observe by default) |
Blocked requests return JSON with HTTP 403 or 429 as appropriate. Incidents are POSTed to the bridge (default path /ingest if your PRIMEDEFENDER_BRIDGE_URL has no path).
Requirements
- Python 3.10+
- A running PrimeDefender bridge that accepts the incident JSON (see your dashboard docs).
Install
pip install primedefender-fastapi
For a local editable install while developing the package:
pip install -e ./primedefender-fastapi
Environment variables
Set these in your process environment or load them with python-dotenv before the app imports settings (see below).
| Variable | Required | Description |
|---|---|---|
PRIMEDEFENDER_BRIDGE_URL |
Yes* | Bridge base URL, e.g. http://localhost:3000 (path /ingest is added if missing) |
PRIMEDEFENDER_API_KEY |
Yes* | API key sent as X-Api-Key / Authorization: Bearer |
PRIMEDEFENDER_SITE_ID |
Yes* | Site identifier in payloads |
PRIMEDEFENDER_SITE_LAT |
Recommended | Target latitude for map “to” pin |
PRIMEDEFENDER_SITE_LON |
Recommended | Target longitude |
PRIMEDEFENDER_SITE_REGION_LABEL |
Optional | Human label, e.g. Indonesia, Bali → targetLabel = "{site_id} · {label}" |
PRIMEDEFENDER_PRIVATE_SOURCE_LABEL |
Optional | Label for private/loopback IPs |
PRIMEDEFENDER_AUTH_BYPASS_MODE |
Optional | observe (default) or block |
PRIMEDEFENDER_SUSPICIOUS_REQUEST_MODE |
Optional | observe (default) or block |
PRIMEDEFENDER_MAX_ENCODING_LAYERS |
Optional | Max nested percent-encoding depth allowed in query/body (default 3); deeper chains return 403 (excessive_encoding). Set 0 to disable. |
PRIMEDEFENDER_FLOOD_WINDOW_SECONDS |
Optional | Sliding window length in seconds for the global per-IP request rate (default 10). |
PRIMEDEFENDER_FLOOD_MAX_REQUESTS |
Optional | Max requests per IP per window before 429 / ddos detection (default 60). |
PRIMEDEFENDER_FLOOD_EXEMPT_PATHS |
Optional | Comma-separated paths not counted toward that limit. If unset, defaults to /health (for load-balancer probes). If set to an empty string, no paths are exempt. |
*If bridge URL, API key, or site id is missing, reporting is disabled (middleware still runs detections).
See .env.example in this repository for tuning knobs (PRIMEDEFENDER_BODY_CAP_BYTES, rate limits, GeoIP TTL, etc.).
FastAPI usage
Minimal (configuration only from environment):
from fastapi import FastAPI
from primedefender_fastapi import PrimeDefenderMiddleware
app = FastAPI()
app.add_middleware(PrimeDefenderMiddleware)
Load .env early so variables exist when settings are first read:
from pathlib import Path
from dotenv import load_dotenv
load_dotenv(Path(__file__).resolve().parent / ".env")
Optional constructor overrides (other fields still come from the environment):
app.add_middleware(
PrimeDefenderMiddleware,
site_label="Indonesia, Bali",
auth_bypass_mode="observe",
suspicious_request_mode="block",
)
Explicit settings object (e.g. tests or multi-tenant):
from primedefender_fastapi import PrimeDefenderMiddleware, PrimeDefenderSettings
settings = PrimeDefenderSettings.from_env()
app.add_middleware(PrimeDefenderMiddleware, settings=settings)
Connect to the PrimeDefender bridge
- Run your bridge (often on port
3000or behind HTTPS). - Set
PRIMEDEFENDER_BRIDGE_URLto that origin, e.g.http://localhost:3000. - Ensure the bridge exposes
POST /ingest(or set the full URL including path). - Use a valid
PRIMEDEFENDER_API_KEYaccepted by the bridge.
Health check (typical): GET http://localhost:3000/health.
Test SQLi / XSS locally
With the API on port 8000:
SQL injection (query)
curl "http://127.0.0.1:8000/auth/login?next=' OR 1=1 --"
XSS
curl "http://127.0.0.1:8000/?q=%3Cscript%3Ealert(1)%3C/script%3E"
Map labels (optional test headers)
curl "http://127.0.0.1:8000/auth/login?next=' OR 1=1 --" \
-H "X-Prime-Source-Lat: 34.6937" \
-H "X-Prime-Source-Lon: 135.5023" \
-H "X-Prime-Source-Label: Japan, Osaka"
Building and publishing
Uses hatchling (PEP 517):
pip install build
python -m build
Upload dist/* to PyPI with twine (use API tokens and trusted publishing in CI in production).
License
MIT — see LICENSE.
Repository
Placeholder links are set in pyproject.toml (Homepage / Repository). Replace with your real GitHub URL before publishing.
Metadata
Release files for primedefender-fastapi 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| primedefender_fastapi-0.1.9.tar.gz | 27.9 kB | Without provenance | Details for primedefender_fastapi-0.1.9.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| primedefender_fastapi-0.1.9-py3-none-any.whl | Python 3 | none | any | Details for primedefender_fastapi-0.1.9-py3-none-any.whl |
Total release size: 60.3 kB
Release files / primedefender_fastapi-0.1.9.tar.gz
| Download URL | primedefender_fastapi-0.1.9.tar.gz |
|---|---|
| Size | 27.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4a0c27fe01dfbb1ef54eb66a9e773c263048c4ddfa32d364939e050639b37cb
|
|
BLAKE2b-256 checksum How to use checksums |
02aee786dc14432a3aab18300e71b3077c9258952c670151dd38071b88771ad2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / primedefender_fastapi-0.1.9-py3-none-any.whl
| Download URL | primedefender_fastapi-0.1.9-py3-none-any.whl |
|---|---|
| Size | 32.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eaf028b99f59fdd72b0ae6cbceeda5793f164aef976d2ed01ae8e97fcd0f1189
|
|
BLAKE2b-256 checksum How to use checksums |
b662441d313937bbbc30aa263faeea9b0f40b7eb06ac9250d6be20ba4ab99fc6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Security for primedefender-fastapi 0.1.9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.