Communitygithub.com

revisión-de-seguridad

Utiliza esta habilidad al agregar autenticación, manejar entradas de usuario, trabajar con secretos, crear endpoints de API o implementar funciones sensibles de pago. Proporciona una lista de verificación de seguridad integral y patrones.

¿Qué es revisión-de-seguridad?

La habilidad de revisión de seguridad es una guía exhaustiva diseñada para desarrolladores que implementan características sensibles como autenticación, manejo de entradas de usuario, secretos y pagos. Cubre diez categorías clave de seguridad, incluyendo gestión de secretos, validación de entradas, prevención de inyección SQL, autenticación/autorización, prevención XSS, protección CSRF, limitación de tasa, exposición de datos sensibles, seguridad blockchain en Solana y seguridad de dependencias. Cada categoría proporciona ejemplos de código en TypeScript, con patrones FAIL para evitar y PASS para implementar, y pasos de verificación para confirmar la implementación. La habilidad también incluye pruebas de seguridad automatizadas con Jest y una lista de verificación previa al despliegue para asegurar que ningún aspecto de seguridad pase desapercibido antes de la implementación en producción. Está optimizada para plataformas como Next.js, Supabase y Solana, y referencia recursos estándar de la industria como OWASP Top 10. El enfoque principal es la prevención más que la reacción, con un fuerte énfasis en el cumplimiento de mejores prácticas de seguridad en todo el ciclo de vida del desarrollo.

Compatible con~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/security-review

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Habilidad de Revisión de Seguridad

Esta habilidad asegura que todo el código siga las mejores prácticas de seguridad e identifique posibles vulnerabilidades.

Cuándo Activarla

  • Implementando autenticación o autorización
  • Manejando entradas de usuario o cargas de archivos
  • Creando nuevos endpoints de API
  • Trabajando con secretos o credenciales
  • Implementando funciones de pago
  • Almacenando o transmitiendo datos sensibles
  • Integrando APIs de terceros

Lista de Verificación de Seguridad

1. Gestión de Secretos

FALLO: NUNCA Hagas Esto

const apiKey = "sk-proj-xxxxx"  // Secreto hardcodeado
const dbPassword = "password123" // En código fuente

PASA: SIEMPRE Haz Esto

const apiKey = process.env.OPENAI_API_KEY
const dbUrl = process.env.DATABASE_URL

// Verificar que los secretos existen
if (!apiKey) {
  throw new Error('OPENAI_API_KEY no configurado')
}

Pasos de Verificación

  • No hay claves de API, tokens o contraseñas hardcodeadas
  • Todos los secretos en variables de entorno
  • .env.local en .gitignore
  • No hay secretos en el historial de git
  • Secretos de producción en la plataforma de hosting (Vercel, Railway)

2. Validación de Entradas

Siempre Valida las Entradas de Usuario

import { z } from 'zod'

// Definir esquema de validación
const CreateUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(1).max(100),
  age: z.number().int().min(0).max(150)
})

// Validar antes de procesar
export async function createUser(input: unknown) {
  try {
    const validated = CreateUserSchema.parse(input)
    return await db.users.create(validated)
  } catch (error) {
    if (error instanceof z.ZodError) {
      return { success: false, errors: error.issues }
    }
    throw error
  }
}

Validación de Carga de Archivos

function validateFileUpload(file: File) {
  // Verificación de tamaño (máx. 5MB)
  const maxSize = 5 * 1024 * 1024
  if (file.size > maxSize) {
    throw new Error('Archivo demasiado grande (máx. 5MB)')
  }

  // Verificación de tipo
  const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
  if (!allowedTypes.includes(file.type)) {
    throw new Error('Tipo de archivo no válido')
  }

  // Verificación de extensión
  const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
  const extension = file.name.toLowerCase().match(/\.\[^.]+$/)?.[0]
  if (!extension || !allowedExtensions.includes(extension)) {
    throw new Error('Extensión de archivo no válida')
  }

  return true
}

Pasos de Verificación

  • Todas las entradas de usuario validadas con esquemas
  • Cargas de archivos restringidas (tamaño, tipo, extensión)
  • No uso directo de entrada de usuario en consultas
  • Validación por lista blanca (no lista negra)
  • Mensajes de error no filtran información sensible

3. Prevención de Inyección SQL

FALLO: NUNCA Concatenes SQL

// PELIGROSO - Vulnerabilidad de inyección SQL
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
await db.query(query)

PASA: SIEMPRE Usa Consultas Parametrizadas

// Seguro - consulta parametrizada
const { data } = await supabase
  .from('users')
  .select('*')
  .eq('email', userEmail)

// O con SQL puro
await db.query(
  'SELECT * FROM users WHERE email = $1',
  [userEmail]
)

Pasos de Verificación

  • Todas las consultas a base de datos usan consultas parametrizadas
  • No hay concatenación de cadenas en SQL
  • ORM/constructor de consultas usado correctamente
  • Consultas de Supabase debidamente sanitizadas

4. Autenticación y Autorización

Manejo de Tokens JWT

// FALLO: INCORRECTO: localStorage (vulnerable a XSS)
localStorage.setItem('token', token)

// PASA: CORRECTO: cookies httpOnly
res.setHeader('Set-Cookie',
  `token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)

Verificaciones de Autorización

export async function deleteUser(userId: string, requesterId: string) {
  // SIEMPRE verificar autorización primero
  const requester = await db.users.findUnique({
    where: { id: requesterId }
  })

  if (requester.role !== 'admin') {
    return NextResponse.json(
      { error: 'No autorizado' },
      { status: 403 }
    )
  }

  // Proceder con la eliminación
  await db.users.delete({ where: { id: userId } })
}

Seguridad a Nivel de Fila (Supabase)

-- Habilitar RLS en todas las tablas
ALTER TABLE users ENABLE ROW LEVEL SECURITY;

-- Los usuarios solo pueden ver sus propios datos
CREATE POLICY "Usuarios ven sus propios datos"
  ON users FOR SELECT
  USING (auth.uid() = id);

-- Los usuarios solo pueden actualizar sus propios datos
CREATE POLICY "Usuarios actualizan sus propios datos"
  ON users FOR UPDATE
  USING (auth.uid() = id);

Pasos de Verificación

  • Tokens almacenados en cookies httpOnly (no localStorage)
  • Verificaciones de autorización antes de operaciones sensibles
  • Seguridad a nivel de fila habilitada en Supabase
  • Control de acceso basado en roles implementado
  • Gestión de sesión segura

5. Prevención XSS

Sanitizar HTML

import DOMPurify from 'isomorphic-dompurify'

// SIEMPRE sanitizar HTML proporcionado por el usuario
function renderUserContent(html: string) {
  const clean = DOMPurify.sanitize(html, {
    ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
    ALLOWED_ATTR: []
  })
  return <div dangerouslySetInnerHTML={{ __html: clean }} />
}

Política de Seguridad de Contenido

Comience estricto y suavice solo con un plan de eliminación documentado. No use por defecto 'unsafe-inline' o 'unsafe-eval'; neutralizan gran parte de la protección de CSP y deben tratarse como deuda de compatibilidad temporal.

// next.config.js
const securityHeaders = [
  {
    key: 'Content-Security-Policy',
    value: `
      default-src 'self';
      base-uri 'self';
      object-src 'none';
      frame-ancestors 'none';
      script-src 'self';
      style-src 'self';
      img-src 'self' data: https:;
      font-src 'self';
      connect-src 'self' https://api.example.com;
    `.replace(/\s{2,}/g, ' ').trim()
  }
]

Pasos de Verificación

  • HTML proporcionado por el usuario sanitizado
  • Cabeceras CSP configuradas
  • No hay renderizado de contenido dinámico no validado
  • Protección XSS integrada de React utilizada

6. Protección CSRF

Tokens CSRF

import { csrf } from '@/lib/csrf'

export async function POST(request: Request) {
  const token = request.headers.get('X-CSRF-Token')

  if (!csrf.verify(token)) {
    return NextResponse.json(
      { error: 'Token CSRF no válido' },
      { status: 403 }
    )
  }

  // Procesar solicitud
}

Cookies SameSite

res.setHeader('Set-Cookie',
  `session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)

Pasos de Verificación

  • Tokens CSRF en operaciones que cambian estado
  • SameSite=Strict en todas las cookies
  • Patrón de cookie de doble envío implementado

7. Limitación de Tasa

Limitación de Tasa de API

import rateLimit from 'express-rate-limit'

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 100, // 100 solicitudes por ventana
  message: 'Demasiadas solicitudes'
})

// Aplicar a rutas
app.use('/api/', limiter)

Operaciones Costosas

// Limitación de tasa agresiva para búsquedas
const searchLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minuto
  max: 10, // 10 solicitudes por minuto
  message: 'Demasiadas solicitudes de búsqueda'
})

app.use('/api/search', searchLimiter)

Pasos de Verificación

  • Limitación de tasa en todos los endpoints de API
  • Límites más estrictos en operaciones costosas
  • Limitación de tasa basada en IP
  • Limitación de tasa basada en usuario (autenticado)

8. Exposición de Datos Sensibles

Registro (Logging)

// FALLO: INCORRECTO: Registrar datos sensibles
console.log('Inicio de sesión:', { email, password })
console.log('Pago:', { cardNumber, cvv })

// PASA: CORRECTO: Ocultar datos sensibles
console.log('Inicio de sesión:', { email, userId })
console.log('Pago:', { last4: card.last4, userId })

Mensajes de Error

// FALLO: INCORRECTO: Exponer detalles internos
catch (error) {
  return NextResponse.json(
    { error: error.message, stack: error.stack },
    { status: 500 }
  )
}

// PASA: CORRECTO: Mensajes de error genéricos
catch (error) {
  console.error('Error interno:', error)
  return NextResponse.json(
    { error: 'Ocurrió un error. Intente nuevamente.' },
    { status: 500 }
  )
}

Pasos de Verificación

  • No hay contraseñas, tokens o secretos en registros
  • Mensajes de error genéricos para usuarios
  • Errores detallados solo en registros del servidor
  • No hay trazas de pila expuestas a los usuarios

9. Seguridad Blockchain (Solana)

Verificación de Cartera

import { verify } from '@solana/web3.js'

async function verifyWalletOwnership(
  publicKey: string,
  signature: string,
  message: string
) {
  try {
    const isValid = verify(
      Buffer.from(message),
      Buffer.from(signature, 'base64'),
      Buffer.from(publicKey, 'base64')
    )
    return isValid
  } catch (error) {
    return false
  }
}

Verificación de Transacciones

async function verifyTransaction(transaction: Transaction) {
  // Verificar destinatario
  if (transaction.to !== expectedRecipient) {
    throw new Error('Destinatario no válido')
  }

  // Verificar monto
  if (transaction.amount > maxAmount) {
    throw new Error('El monto excede el límite')
  }

  // Verificar que el usuario tiene saldo suficiente
  const balance = await getBalance(transaction.from)
  if (balance < transaction.amount) {
    throw new Error('Saldo insuficiente')
  }

  return true
}

Pasos de Verificación

  • Firmas de cartera verificadas
  • Detalles de transacción validados
  • Verificaciones de saldo antes de transacciones
  • No firma de transacciones a ciegas

10. Seguridad de Dependencias

Actualizaciones Regulares

# Verificar vulnerabilidades
npm audit

# Corregir problemas solucionables automáticamente
npm audit fix

# Actualizar dependencias
npm update

# Verificar paquetes desactualizados
npm outdated

Archivos de Bloqueo

# SIEMPRE confirmar archivos de bloqueo
git add package-lock.json

# Usar en CI/CD para compilaciones reproducibles
npm ci  # En lugar de npm install

Pasos de Verificación

  • Dependencias actualizadas
  • No hay vulnerabilidades conocidas (npm audit clean)
  • Archivos de bloqueo confirmados
  • Dependabot habilitado en GitHub
  • Actualizaciones de seguridad periódicas

Pruebas de Seguridad

Pruebas de Seguridad Automatizadas

// Probar autenticación
test('requiere autenticación', async () => {
  const response = await fetch('/api/protected')
  expect(response.status).toBe(401)
})

// Probar autorización
test('requiere rol de admin', async () => {
  const response = await fetch('/api/admin', {
    headers: { Authorization: `Bearer ${userToken}` }
  })
  expect(response.status).toBe(403)
})

// Probar validación de entrada
test('rechaza entrada no válida', async () => {
  const response = await fetch('/api/users', {
    method: 'POST',
    body: JSON.stringify({ email: 'no-es-un-email' })
  })
  expect(response.status).toBe(400)
})

// Probar limitación de tasa
test('aplica límites de tasa', async () => {
  const requests = Array(101).fill(null).map(() =>
    fetch('/api/endpoint')
  )

  const responses = await Promise.all(requests)
  const tooManyRequests = responses.filter(r => r.status === 429)

  expect(tooManyRequests.length).toBeGreaterThan(0)
})

Lista de Verificación de Seguridad Pre-Despliegue

Antes de CUALQUIER despliegue en producción:

  • Secretos: Sin secretos hardcodeados, todos en variables de entorno
  • Validación de Entradas: Todas las entradas de usuario validadas
  • Inyección SQL: Todas las consultas parametrizadas
  • XSS: Contenido de usuario sanitizado
  • CSRF: Protección habilitada
  • Autenticación: Manejo adecuado de tokens
  • Autorización: Verificaciones de rol implementadas
  • Limitación de Tasa: Habilitada en todos los endpoints
  • HTTPS: Aplicado en producción
  • Cabeceras de Seguridad: CSP, X-Frame-Options configurados
  • Manejo de Errores: Sin datos sensibles en errores
  • Registro (Logging): Sin datos sensibles registrados
  • Dependencias: Actualizadas, sin vulnerabilidades
  • Seguridad a Nivel de Fila: Habilitada en Supabase
  • CORS: Configurado correctamente
  • Cargas de Archivos: Validadas (tamaño, tipo)
  • Firmas de Cartera: Verificadas (si hay blockchain)

Recursos


Recuerde: La seguridad no es opcional. Una vulnerabilidad puede comprometer toda la plataforma. En caso de duda, opte por la precaución.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados