Skip to main content

One-line security for Python web applications

Project description

Arcis Python

One-line security for Python web applications.

Arcis is a cross-platform security library that provides drop-in protection against common web vulnerabilities. Part of the Arcis ecosystem with implementations for Node.js, Python, Go, Java, and C#.

Installation

# Core library (no dependencies)
pip install arcis

# With framework integrations
pip install arcis[flask]
pip install arcis[fastapi]
pip install arcis[django]

# All frameworks + dev tools
pip install arcis[dev]

Quick Start

Flask

from flask import Flask
from arcis import Arcis

app = Flask(__name__)
Arcis(app)  # That's it! Your app is now protected.

@app.route('/')
def hello():
    return 'Hello, World!'

FastAPI

from fastapi import FastAPI
from arcis.fastapi import ArcisMiddleware

app = FastAPI()
app.add_middleware(ArcisMiddleware)

@app.get('/')
async def hello():
    return {'message': 'Hello, World!'}

Django

# settings.py
MIDDLEWARE = [
    'arcis.django.ArcisMiddleware',
    # ... other middleware
]

# Optional configuration
ARCIS_CONFIG = {
    'rate_limit_max': 100,
    'rate_limit_window_ms': 60000,
    'sanitize_xss': True,
    'sanitize_sql': True,
}

Features

🧹 Input Sanitization

Automatically sanitize user input to prevent:

  • XSS (Cross-Site Scripting)
  • SQL Injection
  • NoSQL Injection (MongoDB operators)
  • Path Traversal (../ attacks)
  • Prototype Pollution (__proto__, constructor)
from arcis import sanitize_string, sanitize_dict

# Sanitize a string
clean = sanitize_string("<script>alert('xss')</script>")
# Result: "&lt;script&gt;alert(&#x27;xss&#x27;)&lt;/script&gt;"

# Sanitize a dictionary (including nested objects)
data = {"name": "<script>xss</script>", "$gt": ""}
clean = sanitize_dict(data)
# Result: {"name": "&lt;script&gt;..."}  ($gt key removed)

🚦 Rate Limiting

Protect against brute force and DDoS attacks:

from arcis import RateLimiter

limiter = RateLimiter(
    max_requests=100,      # 100 requests
    window_ms=60000,       # per minute
)

# In your route handler
try:
    limiter.check(request)
except RateLimitExceeded as e:
    return {"error": e.message}, 429

🔒 Security Headers

Automatically add security headers to all responses:

  • Content-Security-Policy
  • X-Content-Type-Options: nosniff
  • X-Frame-Options: DENY
  • Strict-Transport-Security
  • X-XSS-Protection: 1; mode=block

✅ Input Validation

from arcis import Validator, validate_email, validate_url

# Quick validation
if validate_email(user_input):
    print("Valid email!")

# Full validator
assert Validator.email("test@example.com")  # True
assert Validator.url("https://example.com")  # True
assert Validator.uuid("550e8400-e29b-41d4-a716-446655440000")  # True
assert Validator.length("hello", min_len=3, max_len=10)  # True

📝 Safe Logging

Log safely without exposing secrets:

from arcis import SafeLogger

logger = SafeLogger()

# Automatically redacts sensitive fields
logger.info("User login", {"email": "user@test.com", "password": "secret"})
# Output: {"email": "user@test.com", "password": "[REDACTED]"}

# Prevents log injection (removes newlines/control characters)
logger.info("User: attacker\nAdmin: true")  # Newlines stripped

Configuration

All frameworks support the same configuration options:

# Flask
Arcis(
    app,
    sanitize=True,
    sanitize_xss=True,
    sanitize_sql=True,
    sanitize_nosql=True,
    sanitize_path=True,
    rate_limit=True,
    rate_limit_max=100,
    rate_limit_window_ms=60000,
    headers=True,
    csp="default-src 'self'",
)

# FastAPI
app.add_middleware(
    ArcisMiddleware,
    rate_limit_max=50,
    sanitize_sql=False,
)

# Django (settings.py)
ARCIS_CONFIG = {
    'rate_limit_max': 50,
    'sanitize_sql': False,
}

Standalone Middleware (Django)

Use individual components if you only need specific protection:

MIDDLEWARE = [
    'arcis.django.ArcisSanitizeMiddleware',   # Only sanitization
    'arcis.django.ArcisRateLimitMiddleware',  # Only rate limiting
    'arcis.django.ArcisHeadersMiddleware',    # Only security headers
]

Testing

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

# Run tests
pytest tests/ -v

# With coverage
pytest tests/ --cov=arcis --cov-report=html

API Reference

Core Classes

Class Description
Arcis Main class - configures all protections
Sanitizer Input sanitization
RateLimiter Rate limiting
SecurityHeaders Security headers
Validator Input validation
SafeLogger Safe logging with redaction

Exceptions

Exception Description
RateLimitExceeded Raised when rate limit is exceeded
ValidationError Raised when validation fails

Convenience Functions

Function Description
sanitize_string(value) Sanitize a single string
sanitize_dict(data) Sanitize a dictionary
sanitize_xss(value) XSS sanitization only
sanitize_sql(value) SQL injection sanitization only
sanitize_nosql(data) NoSQL injection sanitization only
sanitize_path(value) Path traversal sanitization only
validate_email(value) Validate email format
validate_url(value) Validate URL format
validate_uuid(value) Validate UUID format

License

MIT License - see LICENSE file for details.

Contributing

Contributions welcome! Please submit pull requests to the main Arcis repository.

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

arcis-1.0.0.tar.gz (50.7 kB view details)

Uploaded Source

Built Distribution

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

arcis-1.0.0-py3-none-any.whl (57.3 kB view details)

Uploaded Python 3

File details

Details for the file arcis-1.0.0.tar.gz.

File metadata

  • Download URL: arcis-1.0.0.tar.gz
  • Upload date:
  • Size: 50.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for arcis-1.0.0.tar.gz
Algorithm Hash digest
SHA256 526715ab4a7f64f08209e208065c7abc1a8198f9011bb2f653e3e2fd9fc87653
MD5 bc7e2ecf0e85444ccbc0e6a486c5a33e
BLAKE2b-256 ce52c038164afd77c719661857e1924a82ed9b17c492b94c847b0059ae35a650

See more details on using hashes here.

File details

Details for the file arcis-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: arcis-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 57.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for arcis-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 176ca063374e57431a3ed52317517c8f027e8e959959bf551f0ab9f10bc1ee63
MD5 b6f5fd46892111bbb9c91e8cdf7f5af2
BLAKE2b-256 7ec20de2de7fdec94aed8e16d6dd8abb8b954c5001ed30fc76a4b613b808eaee

See more details on using hashes here.

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