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 Ko-fi

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.16.tar.gz (35.7 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.16-py3-none-any.whl (57.3 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for apiposture-1.0.16.tar.gz
Algorithm Hash digest
SHA256 a3457f55a40ede0dd3b419b068581f3a3dabf0cf33cecb1f82c93822ff5701f0
MD5 cabfe868e2d5e468778f49ab1afab98c
BLAKE2b-256 850947cd0a4ff9f897112ca9d5ab3bc8043e1d4b467cee33fe0e7cb233eaee62

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for apiposture-1.0.16-py3-none-any.whl
Algorithm Hash digest
SHA256 ffed3be32f86f82f1418034db40e2e2d9969cca2a0efb1ddff724b601dc7e961
MD5 433ae9ca20409443e227dd6122936338
BLAKE2b-256 7aabe4502ab22986841a842a9a0afce9cad6e9fa7eab0f5673a6dc877440eb1d

See more details on using hashes here.

Provenance

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