Communitygithub.com

security-review

Utiliza esta skill al agregar autenticación, manejar entrada de usuarios, trabajar con secretos, crear endpoints de API o implementar funciones sensibles como pagos. Proporciona una lista de verificación completa de seguridad y patrones.

¿Qué es security-review?

Esta skill de revisión de seguridad está diseñada para que los agentes de IA (como Claude Code, Cursor, Codex) y los desarrolladores garanticen que todo el código cumpla con las mejores prácticas de seguridad e identifiquen posibles vulnerabilidades. Es útil al implementar autenticación, manejar entrada de usuarios, trabajar con secretos, crear endpoints de API, procesar pagos o almacenar datos sensibles. La skill proporciona una lista de verificación de seguridad exhaustiva que cubre gestión de secretos, validación de entradas, prevención de inyección SQL, manejo de autenticación/autorización (incluyendo JWT y RLS de Supabase), prevención de XSS, protección CSRF, limitación de velocidad, prevención de exposición de datos sensibles, seguridad en blockchain (Solana) y seguridad de dependencias. Incluye ejemplos de código con patrones FAIL (nunca hacer) y PASS (siempre hacer), así como pasos de verificación y pruebas de seguridad automatizadas. La skill es independiente de la plataforma, pero incluye configuraciones específicas para Next.js, Supabase y entornos de hosting como Vercel y Railway.

Compatible con~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/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 garantiza que todo el código siga las mejores prácticas de seguridad e identifique posibles vulnerabilidades.

Cuándo Activar

  • Implementando autenticación o autorización
  • Manejando entrada del usuario o carga 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

FALLA: NUNCA Hacer Esto

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

PASA: SIEMPRE Hacer Esto

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

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

Pasos de Verificación

  • No hay claves de API, tokens o contraseñas codificadas
  • 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 Entrada

Siempre Validar la Entrada del 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) {
  // Verificar tamaño (máximo 5MB)
  const maxSize = 5 * 1024 * 1024
  if (file.size > maxSize) {
    throw new Error('Archivo demasiado grande (máx. 5MB)')
  }

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

  // Verificar 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 del usuario validadas con esquemas
  • Cargas de archivos restringidas (tamaño, tipo, extensión)
  • No se usa directamente la entrada del usuario en consultas
  • Validación por lista blanca (no lista negra)
  • Los mensajes de error no filtran información sensible

3. Prevención de Inyección SQL

FALLA: NUNCA Concatenar SQL

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

PASA: SIEMPRE Usar Consultas Parametrizadas

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

// O con SQL sin procesar
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 correctamente saneadas

4. Autenticación y Autorización

Manejo de Token JWT

// FALLA: 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 sesiones segura

5. Prevención de XSS

Sanear HTML

import DOMPurify from 'isomorphic-dompurify'

// SIEMPRE sanear 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 (CSP)

Comience estricto y relaje 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 saneado
  • Encabezados CSP configurados
  • No hay renderizado de contenido dinámico sin validar
  • 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 modifican el estado
  • SameSite=Strict en todas las cookies
  • Patrón de cookie de doble envío implementado

7. Limitación de Velocidad

Limitación de Velocidad 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 velocidad 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 velocidad en todos los endpoints de API
  • Límites más estrictos en operaciones costosas
  • Limitación de velocidad basada en IP
  • Limitación de velocidad basada en usuario (autenticado)

8. Exposición de Datos Sensibles

Registro (Logging)

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

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

Mensajes de Error

// FALLA: 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. Inténtalo de nuevo.' },
    { status: 500 }
  )
}

Pasos de Verificación

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

9. Seguridad en 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 tenga 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 hay firma ciega de transacciones

10. Seguridad de Dependencias

Actualizaciones Regulares

# Verificar vulnerabilidades
npm audit

# Corregir problemas solucionables automáticamente
npm audit fix

# Actualizar dependencias
npm update

# Verificar paquetes obsoletos
npm outdated

Archivos de Bloqueo (Lock Files)

# 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
  • Sin vulnerabilidades conocidas (npm audit limpio)
  • 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 administrador', 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 velocidad
test('aplica límites de velocidad', 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 Previa al Despliegue

Antes de CUALQUIER despliegue en producción:

  • Secretos: No hay secretos codificados, todos en variables de entorno
  • Validación de Entrada: Todas las entradas del usuario validadas
  • Inyección SQL: Todas las consultas parametrizadas
  • XSS: Contenido de usuario saneado
  • CSRF: Protección habilitada
  • Autenticación: Manejo adecuado de tokens
  • Autorización: Verificaciones de rol implementadas
  • Limitación de Velocidad: Habilitada en todos los endpoints
  • HTTPS: Aplicado en producción
  • Encabezados 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: Correctamente configurado
  • Carga de Archivos: Validada (tamaño, tipo)
  • Firmas de Cartera: Verificadas (si blockchain)

Recursos


Recuerda: La seguridad no es opcional. Una vulnerabilidad puede comprometer toda la plataforma. En caso de duda, peca de precavido.

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

Skills relacionados