"Apply when building any API endpoint, authentication system, or web service. Covers OWASP Top 10, rate limiting, input validation, JWT patterns, and secrets management."
Install
npx skillscat add tryboy869/dojutsu-for-ai/api-security Install via the SkillsCat registry.
SKILL.md
API SECURITY â Non-Negotiable Standards
Input Validation (Pydantic / Zod)
class JobSubmit(BaseModel):
job_type: str = Field(..., pattern=r"^[a-z_]{3,50}$")
payload: dict = Field(default_factory=dict)
@validator("payload")
def limit_payload_size(cls, v):
if len(json.dumps(v)) > 10_000:
raise ValueError("Payload exceeds 10KB limit")
return vRate Limiting
# Every public endpoint needs rate limiting
from slowapi import Limiter
limiter = Limiter(key_func=get_remote_address)
@app.post("/jobs")
@limiter.limit("100/minute")
async def submit_job(request: Request, ...):
...Authentication
# JWT validation â always verify signature AND expiry
# Never trust payload without verification
def verify_token(token: str) -> dict:
return jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
# raises jwt.ExpiredSignatureError, jwt.InvalidTokenErrorSecrets Management
# NEVER hardcode â always from environment
import os
from pydantic import BaseSettings
class Settings(BaseSettings):
secret_key: str # must be set or app fails to start
redis_url: str = "redis://localhost:6379/0"
class Config:
env_file = ".env"CORS, Headers
app.add_middleware(
CORSMiddleware,
allow_origins=["https://yourdomain.com"], # NOT "*" in production
allow_methods=["GET", "POST"],
)
# Add security headers
@app.middleware("http")
async def security_headers(request, call_next):
response = await call_next(request)
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["X-Frame-Options"] = "DENY"
return responseForbidden
â allow_origins=["*"] in production
â Secrets in code or git
â No rate limiting on public endpoints
â Logging request bodies (may contain PII/secrets)
â SQL string concatenation (use ORM or parameterized queries)