Renderz Studio
Academia
Proyectos
Servicios
Arsenal
Repo
Herramientas
Skills
El Oráculo
Guía Gratis
← El Arsenal
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

Capas de defensa

Modelo de seguridad en profundidad

Input validation

Filtrar antes de enviar al LLM

Output filtering

Validar respuestas antes de mostrar

Rate limiting

Proteger contra abusos de coste

01

Modelo de seguridad en profundidad

Nunca confíes en una sola capa. La seguridad de IA requiere múltiples barreras que trabajen juntas.

CapaQué protegeImplementación
Input ValidationPrompt injection, contenido ilegalRegex, clasificadores, sanitización
Rate LimitingCostes, DoSRedis, Upstash, middleware
Output FilteringContenido dañino, PIIPost-processing, regex
MonitoringPatrones sospechososLogs, 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.

Guías relacionadas

Optimización de Costes API

Rate limiting y caching

Testing de Aplicaciones IA

Tests de seguridad

¿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 · €29

PayPal · Acceso inmediato

¿Hablamos?