OperacionesAvanzado40 min
AI Safety y Guardrails
Filtros de contenido · rate limiting · validación · protege tu API de abusos
SafetyGuardrailsSeguridad
✓ Guía gratuita · Acceso completo
Mapa rápido · salta al paso que te interese
01
Modelo de seguridad en profundidad
Nunca confíes en una sola capa. La seguridad de IA requiere múltiples barreras que trabajen juntas.
| Capa | Qué protege | Implementación |
|---|---|---|
| Input Validation | Prompt injection, contenido ilegal | Regex, clasificadores, sanitización |
| Rate Limiting | Costes, DoS | Redis, Upstash, middleware |
| Output Filtering | Contenido dañino, PII | Post-processing, regex |
| Monitoring | Patrones sospechosos | Logs, alertas, dashboards |
⚠ Advertencia
El 80% de los ataques a APIs de IA son prompt injection. Nunca pases input del usuario directamente al system prompt sin sanitizar.
02
Input validation: filtrar antes del LLM
lib/guardrails/inputValidator.ts
const BLOCKED_PATTERNS = [
/ignore (all |previous |above )?instructions/i,
/you are now/i,
/pretend (to be|you are)/i,
/disregard (your |all )?rules/i,
/jailbreak/i,
/DAN mode/i,
]
const MAX_INPUT_LENGTH = 10000
const MAX_MESSAGES = 50
export function validateInput(input: string, messages: any[]): { valid: boolean; error?: string } {
// Length check
if (input.length > MAX_INPUT_LENGTH) {
return { valid: false, error: 'Input demasiado largo' }
}
// History check
if (messages.length > MAX_MESSAGES) {
return { valid: false, error: 'Conversación demasiado larga' }
}
// Injection patterns
for (const pattern of BLOCKED_PATTERNS) {
if (pattern.test(input)) {
return { valid: false, error: 'Contenido no permitido' }
}
}
return { valid: true }
}03
Output filtering: validar respuestas
lib/guardrails/outputFilter.ts
const PII_PATTERNS = {
email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
phone: /\+?[0-9]{10,15}/g,
ssn: /\d{3}-\d{2}-\d{4}/g,
creditCard: /\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}/g,
}
export function filterOutput(text: string): string {
let filtered = text
// Redact PII
for (const [type, pattern] of Object.entries(PII_PATTERNS)) {
filtered = filtered.replace(pattern, `[REDACTED_${type.toUpperCase()}]`)
}
return filtered
}
export function checkOutputSafety(text: string): boolean {
const dangerousPatterns = [
/how to (make|build|create) (a )?bomb/i,
/instructions for (making |creating )?weapons/i,
]
return !dangerousPatterns.some(p => p.test(text))
}04
Rate limiting con Upstash
middleware.ts
import { Ratelimit } from '@upstash/ratelimit'
import { Redis } from '@upstash/redis'
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, '1 m'), // 10 requests per minute
analytics: true,
})
export async function middleware(request: Request) {
if (request.url.includes('/api/chat')) {
const ip = request.headers.get('x-forwarded-for') ?? '127.0.0.1'
const { success, limit, remaining } = await ratelimit.limit(ip)
if (!success) {
return new Response('Rate limit exceeded', {
status: 429,
headers: {
'X-RateLimit-Limit': limit.toString(),
'X-RateLimit-Remaining': remaining.toString(),
}
})
}
}
}Tip Pro
Combina rate limiting por IP con rate limiting por usuario autenticado para mayor protección.
¿Quieres el sistema completo?
500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.
Curso Completo · €29PayPal · Acceso inmediato