Skip to main content

A CLI security inspection tool for Python API frameworks

Project description

ApiPosture

A CLI security inspection tool for Python API frameworks. Performs static source-code analysis to identify authorization misconfigurations and security risks.

Features

  • Multi-Framework Support: FastAPI, Flask, Django REST Framework
  • 8 Security Rules: Comprehensive detection of common authorization issues
  • Multiple Output Formats: Terminal (Rich), JSON, Markdown
  • Configurable: YAML-based configuration with suppressions
  • CI/CD Ready: Exit codes based on severity for pipeline integration

Installation

pip install apiposture

Quick Start

# Scan current directory
apiposture scan .

# Scan specific path with JSON output
apiposture scan ./src --output json

# Scan and fail on high severity findings (for CI)
apiposture scan . --fail-on high

Security Rules

Rule Name Severity Description
AP001 Public without explicit intent High Public endpoint without AllowAny or explicit marker
AP002 Anonymous on write High AllowAny on POST/PUT/DELETE/PATCH
AP003 Auth conflict Medium Method-level AllowAny overrides class auth
AP004 Missing auth on writes Critical No auth on write endpoints
AP005 Excessive roles Low >3 roles on single endpoint
AP006 Weak role naming Low Generic names like "user", "admin"
AP007 Sensitive keywords Medium admin/debug/export in public routes
AP008 Endpoint without auth High No auth configuration at all

Supported Frameworks

FastAPI

from fastapi import Depends, FastAPI

@app.get("/protected")
async def protected(user = Depends(get_current_user)):
    ...

Flask

from flask import Flask
from flask_login import login_required

@app.route("/protected")
@login_required
def protected():
    ...

Django REST Framework

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated

class ProtectedView(APIView):
    permission_classes = [IsAuthenticated]

Configuration

Create .apiposture.yaml in your project root:

rules:
  disabled:
    - AP006  # Disable weak role naming check

exclude:
  - "**/tests/**"
  - "**/migrations/**"

suppressions:
  - rule: AP001
    route: "/health"
    reason: "Health check is intentionally public"

CLI Options

apiposture scan [PATH] [OPTIONS]

Options:
  -o, --output         Output format: terminal, json, markdown
  -f, --output-file    Write output to file
  -c, --config         Configuration file path
  --severity           Minimum severity: info, low, medium, high, critical
  --fail-on            Exit code 1 if findings at this severity
  --sort-by            Sort by: severity, route, method, classification
  --classification     Filter: public, authenticated, role_restricted
  --method             Filter: GET, POST, PUT, DELETE, PATCH
  --route-contains     Filter routes by substring
  --framework          Filter: fastapi, flask, django_drf
  --rule               Filter by rule ID
  --no-color           Disable colored output
  --no-icons           Disable icons

Development

# Clone the repository
git clone https://github.com/apiposture/apiposture-python
cd apiposture-python

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run linter
ruff check src tests

# Run type checker
mypy src

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

apiposture-1.0.5.tar.gz (33.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

apiposture-1.0.5-py3-none-any.whl (54.5 kB view details)

Uploaded Python 3

File details

Details for the file apiposture-1.0.5.tar.gz.

File metadata

  • Download URL: apiposture-1.0.5.tar.gz
  • Upload date:
  • Size: 33.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for apiposture-1.0.5.tar.gz
Algorithm Hash digest
SHA256 220c624af9107d38a20d88d379f39918253d74b88b1f6a1938eb500a6d2454a5
MD5 580f2e6bda00da42fa2d767447dbb678
BLAKE2b-256 b2a970bb1087ddae87f190727db11dcb4bffc484b7100e4e290a4d9a34b6c7ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for apiposture-1.0.5.tar.gz:

Publisher: publish.yml on BlagoCuljak/ApiPosture.Python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file apiposture-1.0.5-py3-none-any.whl.

File metadata

  • Download URL: apiposture-1.0.5-py3-none-any.whl
  • Upload date:
  • Size: 54.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for apiposture-1.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 b8bcf1f7a172c3dce8c55b3f61a2cba6a15ae3d1d3b349384c01e7e3a6044c54
MD5 d4a3c1ea8a53c480d606b305644d1f81
BLAKE2b-256 ed4858dfa7413d6b20ae270a5dfc484d07a79a860128f3f8f83ef652122e384a

See more details on using hashes here.

Provenance

The following attestation bundles were made for apiposture-1.0.5-py3-none-any.whl:

Publisher: publish.yml on BlagoCuljak/ApiPosture.Python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page