Loading...
Loading...
Understand the defense-in-depth security architecture of Secure Vibe Coding OS. Use this skill when you need to understand the overall security approach, the 5-layer security stack, OWASP scoring, or when to use other security skills. Triggers include "security architecture", "defense in depth", "security layers", "how does security work", "OWASP score", "security overview", "security principles".
npx skill4agent add harperaa/secure-claude-skills security-architecture-overviewUser Browser
│
▼
┌─────────────────────────────────────────────┐
│ Layer 0: Middleware (Security Headers) │
│ • X-Frame-Options: DENY │
│ • Content-Security-Policy │
│ • HSTS (production only) │
│ • X-Content-Type-Options: nosniff │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Layer 1: Rate Limiting │
│ • 5 requests per minute per IP │
│ • Returns HTTP 429 when exceeded │
│ • Prevents brute force & resource abuse │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Layer 2: CSRF Protection │
│ • HMAC-SHA256 cryptographic signing │
│ • Single-use tokens │
│ • Returns HTTP 403 if invalid │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Layer 3: Input Validation │
│ • Zod schema validation │
│ • Automatic XSS sanitization │
│ • Type-safe data transformation │
│ • Returns HTTP 400 if invalid │
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Layer 4: Business Logic │
│ • Your handler code runs here │
│ • Receives validated, sanitized data │
│ • Clerk authentication checked in middleware│
└──────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ Layer 5: Secure Error Handling │
│ • Generic messages in production │
│ • Detailed errors in development │
│ • No information leakage │
└─────────────────────────────────────────────┘// app/api/contact/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { withRateLimit } from '@/lib/withRateLimit';
import { withCsrf } from '@/lib/withCsrf';
import { validateRequest } from '@/lib/validateRequest';
import { contactFormSchema } from '@/lib/validation';
import { handleApiError } from '@/lib/errorHandler';
async function contactHandler(request: NextRequest) {
try {
const body = await request.json();
// Layer 3: Input validation
const validation = validateRequest(contactFormSchema, body);
if (!validation.success) {
return validation.response;
}
const { name, email, subject, message } = validation.data;
// Safe to process - all security layers passed
await sendEmail({ to: 'admin@example.com', from: email, subject, message });
return NextResponse.json({ success: true });
} catch (error) {
// Layer 5: Secure error handling
return handleApiError(error, 'contact-form');
}
}
// Layers 1-2: Apply security middlewares
export const POST = withRateLimit(withCsrf(contactHandler));
export const config = {
runtime: 'nodejs', // Required for crypto operations
};process.env.NODE_ENV === 'production'auth-securitypayment-securitywithRateLimit()withCsrf()lib/validation.tshandleApiError()await auth()runtime: 'nodejs'import { NextRequest, NextResponse } from 'next/server';
import { withRateLimit } from '@/lib/withRateLimit';
import { handleApiError, handleUnauthorizedError } from '@/lib/errorHandler';
import { auth } from '@clerk/nextjs/server';
async function handler(request: NextRequest) {
try {
const { userId } = await auth();
if (!userId) return handleUnauthorizedError();
// Your logic here
return NextResponse.json({ success: true });
} catch (error) {
return handleApiError(error, 'route-name');
}
}
export const GET = withRateLimit(handler);
export const config = { runtime: 'nodejs' };import { NextRequest, NextResponse } from 'next/server';
import { withRateLimit } from '@/lib/withRateLimit';
import { withCsrf } from '@/lib/withCsrf';
import { validateRequest } from '@/lib/validateRequest';
import { handleApiError, handleUnauthorizedError } from '@/lib/errorHandler';
import { contactFormSchema } from '@/lib/validation';
import { auth } from '@clerk/nextjs/server';
async function handler(request: NextRequest) {
try {
const { userId } = await auth();
if (!userId) return handleUnauthorizedError();
const body = await request.json();
const validation = validateRequest(contactFormSchema, body);
if (!validation.success) {
return validation.response;
}
const { name, email, subject, message } = validation.data;
// Process form (send email, save to DB, etc.)
return NextResponse.json({ success: true });
} catch (error) {
return handleApiError(error, 'contact-form');
}
}
export const POST = withRateLimit(withCsrf(handler));
export const config = { runtime: 'nodejs' };import { NextRequest, NextResponse } from 'next/server';
import { withRateLimit } from '@/lib/withRateLimit';
import { validateRequest } from '@/lib/validateRequest';
import { handleApiError } from '@/lib/errorHandler';
import { emailSchema } from '@/lib/validation';
async function handler(request: NextRequest) {
try {
const body = await request.json();
const validation = validateRequest(emailSchema, body);
if (!validation.success) {
return validation.response;
}
const email = validation.data;
// Process (e.g., newsletter signup)
return NextResponse.json({ success: true });
} catch (error) {
return handleApiError(error, 'newsletter');
}
}
export const POST = withRateLimit(handler);
export const config = { runtime: 'nodejs' };// BAD - No protection
export async function POST(request: NextRequest) {
const body = await request.json();
// directly use body.field
return NextResponse.json({ success: true });
}// BAD - No validation
async function handler(request: NextRequest) {
const body = await request.json();
const { title } = body; // Could contain <script> tags!
await saveToDatabase(title);
}// BAD - Information leakage
catch (error) {
return NextResponse.json({
error: error.message, // Could reveal internal paths
stack: error.stack, // Exposes code structure
query: failedQuery // Reveals database schema
}, { status: 500 });
}// BAD - Hardcoded secret
const apiKey = 'sk_live_123456789';
// GOOD - Environment variable
const apiKey = process.env.API_KEY;// BAD - Can be spammed infinitely
export async function POST(request: NextRequest) {
await sendEmail(data);
return NextResponse.json({ success: true });
}
// GOOD - Rate limited
export const POST = withRateLimit(async (request: NextRequest) => {
await sendEmail(data);
return NextResponse.json({ success: true });
});security-awareness/injection-vulnerabilitiessecurity-awareness/auth-vulnerabilitiessecurity-awareness/information-leakagesecurity-awareness/supply-chain-riskssecurity-awareness/business-logic-flawssecurity-awareness/resource-exhaustionsecurity-awareness/awareness-overviewcsrf-protectionrate-limitinginput-validationsecurity-headerserror-handlingauth-securitypayment-securitydependency-securitysecurity-testingsecurity-operationssecurity-operationssecurity-operationssecurity-operationssecurity-operationssecurity-awareness/awareness-overviewsecurity-awareness/injection-vulnerabilitiessecurity-awareness/auth-vulnerabilitiessecurity-awareness/information-leakagesecurity-awareness/supply-chain-riskssecurity-awareness/business-logic-flawssecurity-awareness/resource-exhaustion