Security: API Shield, WAF & Bot Protection

Cloudflare provides security by default — automatic DDoS protection, WAF rules, and rate limiting. Use the Python SDK to programmatically manage your security posture.

API Shield: Protect Your APIs

API Shield validates requests against your OpenAPI schema, automatically blocking malformed or unexpected requests before they reach your code.

from cloudflare import Cloudflare
from typing import Dict, List
import yaml

client = Cloudflare()

class APIProtection:
    """API protection using Cloudflare API Shield"""

    def __init__(self, client: Cloudflare, zone_id: str):
        self.client = client
        self.zone_id = zone_id

    def upload_openapi_schema(self, schema_path: str):
        """Upload OpenAPI schema for automatic validation"""
        with open(schema_path, 'r') as f:
            schema = yaml.safe_load(f)

        result = self.client.api_gateway.schemas.create(
            zone_id=self.zone_id,
            file=schema_path,
            kind="openapi_v3",
        )
        return result.schema_id

Rate Limiting

Set up rate limiting rules to protect endpoints from abuse:

def create_rate_limit(self, endpoint: str, requests_per_minute: int):
    """Create rate limiting rule"""
    rule = self.client.rate_limits.create(
        zone_id=self.zone_id,
        action="block",
        match={
            "request": {
                "url_pattern": f"*{endpoint}*",
                "methods": ["GET", "POST", "PUT", "DELETE"],
            }
        },
        threshold=requests_per_minute,
        period=60,  # 1 minute
        description=f"Rate limit for {endpoint}",
    )
    return rule.id

# Usage
api_shield = APIProtection(client, "your-zone-id")

# Set up rate limiting per endpoint
api_shield.create_rate_limit("/api/v1/users", requests_per_minute=100)
api_shield.create_rate_limit("/api/v1/auth/login", requests_per_minute=10)

Bot Protection

def enable_bot_protection(self, sensitivity: str = "high"):
    """Enable bot protection"""
    self.client.bot_management.update(
        zone_id=self.zone_id,
        enable_js_detection=True,
        fight_mode=True,
        sensitivity=sensitivity,
    )

# Enable bot protection
api_shield.enable_bot_protection(sensitivity="high")

WAF Rules

Create custom WAF rules to block common attack patterns:

def create_waf_rules(self, rules: List[Dict]):
    """Create WAF rules for common attacks"""
    for rule in rules:
        self.client.firewall.rules.create(
            zone_id=self.zone_id,
            filter={
                "expression": rule["expression"],
            },
            action=rule.get("action", "block"),
            description=rule.get("description", ""),
        )

# Define WAF rules
waf_rules = [
    {
        "expression": '(http.request.uri.path contains "../") or (http.request.uri.path contains "..\\")',
        "action": "block",
        "description": "Block path traversal attempts",
    },
    {
        "expression": '(http.request.uri.query contains "<script") or (http.request.body.raw contains "<script")',
        "action": "challenge",
        "description": "Challenge potential XSS",
    },
]

api_shield.create_waf_rules(waf_rules)

Security Analytics

def get_security_analytics(self, start_time: str, end_time: str):
    """Get security analytics"""
    analytics = self.client.zones.analytics.colos.get(
        zone_id=self.zone_id,
        since=start_time,
        until=end_time,
    )

    return {
        "total_requests": analytics.totals.requests,
        "threats_blocked": analytics.totals.threats,
        "bot_requests": analytics.totals.pageviews.bot,
        "human_requests": analytics.totals.pageviews.human,
    }

# Monitor security
stats = api_shield.get_security_analytics(
    "2024-01-01T00:00:00Z",
    "2024-01-31T23:59:59Z"
)
print(f"Threats blocked this month: {stats['threats_blocked']}")

Complete Example

Here's a full security setup combining all the pieces:

from cloudflare import Cloudflare

client = Cloudflare()
api_shield = APIProtection(client, "your-zone-id")

# 1. Upload your API schema for automatic validation
schema_id = api_shield.upload_openapi_schema("openapi.yaml")

# 2. Set up rate limiting
api_shield.create_rate_limit("/api/v1/users", requests_per_minute=100)
api_shield.create_rate_limit("/api/v1/auth/login", requests_per_minute=10)

# 3. Enable bot protection
api_shield.enable_bot_protection(sensitivity="high")

# 4. Create WAF rules
api_shield.create_waf_rules(waf_rules)

# 5. Monitor
stats = api_shield.get_security_analytics(
    "2024-01-01T00:00:00Z",
    "2024-01-31T23:59:59Z"
)
print(f"Threats blocked: {stats['threats_blocked']}")

Migration Reference

You're Using Replace With Why Switch
Kong / Traefik API Shield Built-in rate limiting, schema validation
OAuth2 / JWT libraries Zero Trust Managed authentication, no token management
Flask-Limiter Rate Limiting Edge-based, DDoS protection included