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, and Go.
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: "<script>alert('xss')</script>"
# Sanitize a dictionary (including nested objects)
data = {"name": "<script>xss</script>", "$gt": ""}
clean = sanitize_dict(data)
# Result: {"name": "<script>..."} ($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-PolicyX-Content-Type-Options: nosniffX-Frame-Options: DENYStrict-Transport-SecurityX-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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arcis-1.1.0.tar.gz.
File metadata
- Download URL: arcis-1.1.0.tar.gz
- Upload date:
- Size: 64.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ec86a97fd8ae4aa24bc9ecd5f80d66e950d035d98f47ee8ea15f0410232f3d5
|
|
| MD5 |
39add6dd91bc6b477f88960985f14721
|
|
| BLAKE2b-256 |
30ced058394873ebb3dd03347721814deb85c8a39b8ed670f1f4e19550e7e692
|
File details
Details for the file arcis-1.1.0-py3-none-any.whl.
File metadata
- Download URL: arcis-1.1.0-py3-none-any.whl
- Upload date:
- Size: 76.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
805dd4741a9e2f09223f1b5b1ff083205d825ba52b878f62cd5458cc371fffdd
|
|
| MD5 |
d921bb385f9efd37e993b2f9eeeada86
|
|
| BLAKE2b-256 |
036c18a52aa5a74c6724f8f03801af86e247a9af63b64d055213a0dd62cbab79
|