Skip to main content

A CLI security inspection tool for Python API frameworks

Project description

ApiPosture

Build and Test PyPI Version PyPI Downloads License: MIT Python Buy Me A Coffee

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

Terminal Output

Terminal Output

Findings Report

Findings Report

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.15.tar.gz (35.9 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.15-py3-none-any.whl (57.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: apiposture-1.0.15.tar.gz
  • Upload date:
  • Size: 35.9 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.15.tar.gz
Algorithm Hash digest
SHA256 67c8f5f00c7c74a7b764ab88aaa733f3fa5c2ba904d03f65105f3b0fa37fe63f
MD5 47a0694d5ea024201236863f27e0a219
BLAKE2b-256 bf42728edfc7fde290315a9b4bf26030bd780d7c04f414a4ce3385391dba4bb7

See more details on using hashes here.

Provenance

The following attestation bundles were made for apiposture-1.0.15.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.15-py3-none-any.whl.

File metadata

  • Download URL: apiposture-1.0.15-py3-none-any.whl
  • Upload date:
  • Size: 57.4 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.15-py3-none-any.whl
Algorithm Hash digest
SHA256 f542fcdf89a637a037ebdb8e16fc3f504f2d5ffce0128965690f678e45d80b92
MD5 28d05ba89d8b078e7882530457ba10b1
BLAKE2b-256 92f661f264f423cdcbbcac7902df8156e97b443bdec0754ce4276dd89963521a

See more details on using hashes here.

Provenance

The following attestation bundles were made for apiposture-1.0.15-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