affaan-m/ECC

security-review

Usar este skill al agregar autenticación, manejar entradas de usuario, trabajar con secretos, crear endpoints de API o implementar funcionalidades de pago/sensibles. Proporciona lista de verificación y patrones de seguridad completos.

79CollectingNetwork accessRuns scripts
See how to use itView GitHub source
npx skills add https://github.com/affaan-m/ECC --skill "docs/es/skills/security-review"
Automated source guide

Source checked Jul 28, 2026·Refresh due Oct 26, 2026

Reorganized from the pinned upstream SKILL.md

Turn security-review's source instructions into a guide you can follow

According to the pinned SKILL.md from affaan-m/ECC: Este skill garantiza que todo el código siga las buenas prácticas de seguridad e identifica vulnerabilidades potenciales.

npx skills add https://github.com/affaan-m/ECC --skill "docs/es/skills/security-review"
Check the pinned source

Best fit

  • Usar este skill al agregar autenticación, manejar entradas de usuario, trabajar con secretos, crear endpoints de API o implementar funcionalidades de pago/sensibles. Proporciona lista de verificación y patrones de seguridad completos.

Bring this context

  • A concrete task that matches the documented purpose of security-review.
  • The files, examples, or context the task depends on.
  • Your constraints, target environment, and definition of done.

Expected outputs

  • A result that follows the pinned security-review instructions.
  • A concise record of assumptions, inputs used, and unresolved questions.
  • A final check against the source workflow and relevant permission signals.

Key source sections

Read security-review through these 5 source sections

Sections are extracted automatically from the pinned SKILL.md and link back to the source.

01

Cuándo Activar

Implementar autenticación o autorización

SKILL.md · Cuándo Activar
Implementar autenticación o autorizaciónManejar entrada de usuario o subida de archivosCrear nuevos endpoints de API
02

Lista de Verificación de Seguridad

Comenzar con una política estricta y relajarla solo con un plan de eliminación documentado. No usar 'unsafe-inline' ni 'unsafe-eval' por defecto; neutralizan gran parte de la protección de CSP y deben tratarse como deuda de compatibilidad temporal.

SKILL.md · Lista de Verificación de Seguridad
[ ] Sin claves de API, tokens ni contraseñas hardcodeadas[ ] Todos los secretos en variables de entorno[ ] .env.local en .gitignore
03

1. Gestión de Secretos

[ ] Sin claves de API, tokens ni contraseñas hardcodeadas

SKILL.md · 1. Gestión de Secretos
[ ] Sin claves de API, tokens ni contraseñas hardcodeadas[ ] Todos los secretos en variables de entorno[ ] .env.local en .gitignore
04

FALLA: NUNCA Hacer Esto

Review the “FALLA: NUNCA Hacer Esto” section in the pinned source before continuing.

SKILL.md · FALLA: NUNCA Hacer Esto
Review and apply the “FALLA: NUNCA Hacer Esto” source section.
05

PASA: SIEMPRE Hacer Esto

Review the “PASA: SIEMPRE Hacer Esto” section in the pinned source before continuing.

SKILL.md · PASA: SIEMPRE Hacer Esto
Review and apply the “PASA: SIEMPRE Hacer Esto” source section.

SkillSignal prompt templates

Provide the task, context, and acceptance criteria

These prompts were written by SkillSignal from the source structure; they are not upstream text.

Task-start prompt

Confirm source fit, inputs, and outputs before acting.

Use security-review to help me with: [specific task]. Context: [files, data, or background]. Constraints: [environment, scope, and prohibited actions]. Before acting, check the pinned SKILL.md and explain which sections apply, what inputs are still missing, and what you will deliver.

Source-guided execution

Make the Agent explicitly follow the key extracted sections.

Apply the pinned security-review source to [task]. Pay particular attention to these source sections: “Cuándo Activar”, “Lista de Verificación de Seguridad”, “1. Gestión de Secretos”, “FALLA: NUNCA Hacer Esto”, “PASA: SIEMPRE Hacer Esto”. Preserve the important decision at each step. Mark facts not covered by the source as “needs confirmation” instead of inventing them. Then verify the result against my acceptance criteria: [criteria].

Result-review prompt

Check omissions, permissions, and source drift before delivery.

Review the current security-review result: (1) does it satisfy the original task; (2) were any applicable steps or limits in the pinned SKILL.md missed; (3) did it perform any unauthorized file, command, network, or data action; and (4) which conclusions remain unverified? List issues first, then fix only what the source or user authorization supports.

Output checklist

Verify each item before delivery

The task matches the purpose documented in the SKILL.md.

The source section “Cuándo Activar” has been checked.

The source section “Lista de Verificación de Seguridad” has been checked.

The source section “1. Gestión de Secretos” has been checked.

The source section “FALLA: NUNCA Hacer Esto” has been checked.

Inputs, constraints, and acceptance criteria are explicit.

Unverified facts, compatibility, and outcome claims are clearly marked.

Any file, command, network, or data action has been reviewed.

Choose a different workflow

When another Skill is the better fit

FAQ

What does security-review do?

Este skill garantiza que todo el código siga las buenas prácticas de seguridad e identifica vulnerabilidades potenciales.

How do I start using security-review?

The catalog detected this source-specific install command: npx skills add https://github.com/affaan-m/ECC --skill "docs/es/skills/security-review". Inspect the command and pinned source before running it.

Which Agent platforms does it declare?

No dedicated Agent platform is declared in the pinned source record.

Repository stars
234,327
Repository forks
35,711
Quality
79/100
Source repository last pushed

Quality breakdown

Based on traceable docs and repository signals; stars are not treated as quality.

79/100
Documentation30/30
Specificity11/25
Maintenance20/20
Trust signals18/25

Compare before choosing

Related Agent Skills and source variants

These links are selected from shared tasks, functions, stacks, platforms, and same-name variants. Compare the source owner, documentation, permissions, and maintenance signals.

View original Skill.mdThis page is parsed directly from the repository SKILL.md without editorial rewriting. Collected: Jul 28, 2026 · about 4 min

Skill de Revisión de Seguridad

Este skill garantiza que todo el código siga las buenas prácticas de seguridad e identifica vulnerabilidades potenciales.

Cuándo Activar

  • Implementar autenticación o autorización
  • Manejar entrada de usuario o subida de archivos
  • Crear nuevos endpoints de API
  • Trabajar con secretos o credenciales
  • Implementar funcionalidades de pago
  • Almacenar o transmitir datos sensibles
  • Integrar APIs de terceros

Lista de Verificación de Seguridad

1. Gestión de Secretos

FALLA: NUNCA Hacer Esto

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

PASA: SIEMPRE Hacer 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 not configured')
}

Pasos de Verificación

  • Sin claves de API, tokens ni contraseñas hardcodeadas
  • Todos los secretos en variables de entorno
  • .env.local en .gitignore
  • Sin 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.errors }
    }
    throw error
  }
}

Validación de Subida de Archivos

function validateFileUpload(file: File) {
  // Verificar tamaño (máximo 5MB)
  const maxSize = 5 * 1024 * 1024
  if (file.size > maxSize) {
    throw new Error('File too large (max 5MB)')
  }

  // Verificar tipo
  const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
  if (!allowedTypes.includes(file.type)) {
    throw new Error('Invalid file type')
  }

  // Verificar extensión
  const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
  const extension = file.name.toLowerCase().match(/\.[^.]+$/)?.[0]
  if (!extension || !allowedExtensions.includes(extension)) {
    throw new Error('Invalid file extension')
  }

  return true
}

Pasos de Verificación

  • Todas las entradas del usuario validadas con esquemas
  • Subidas de archivos restringidas (tamaño, tipo, extensión)
  • Sin uso directo de entrada del usuario en consultas
  • Validación por lista blanca (no por lista negra)
  • Los mensajes de error no revelan 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 puro
await db.query(
  'SELECT * FROM users WHERE email = $1',
  [userEmail]
)

Pasos de Verificación

  • Todas las consultas de base de datos usan consultas parametrizadas
  • Sin concatenación de cadenas en SQL
  • ORM/query builder usado correctamente
  • Consultas de Supabase correctamente sanitizadas

4. Autenticación y Autorización

Manejo de Tokens 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 la autorización primero
  const requester = await db.users.findUnique({
    where: { id: requesterId }
  })

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

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

Row Level Security (Supabase)

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

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

-- Los usuarios solo pueden actualizar sus propios datos
CREATE POLICY "Users update own data"
  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
  • Row Level Security habilitado en Supabase
  • Control de acceso basado en roles implementado
  • Gestión de sesiones segura

5. Prevención de 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 }} />
}

Content Security Policy

Comenzar con una política estricta y relajarla solo con un plan de eliminación documentado. No usar 'unsafe-inline' ni 'unsafe-eval' por defecto; 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
  • Sin renderizado de contenido dinámico no validado
  • Protección XSS incorporada 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: 'Invalid CSRF token' },
      { 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 doble envío de cookie implementado

7. Limitación de Velocidad

Limitación de Velocidad en API

import rateLimit from 'express-rate-limit'

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

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

Operaciones Costosas

// Limitación agresiva para búsquedas
const searchLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minuto
  max: 10, // 10 solicitudes por minuto
  message: 'Too many search requests'
})

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

Logging

// FALLA: INCORRECTO: Registrar datos sensibles
console.log('User login:', { email, password })
console.log('Payment:', { cardNumber, cvv })

// PASA: CORRECTO: Redactar datos sensibles
console.log('User login:', { email, userId })
console.log('Payment:', { 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('Internal error:', error)
  return NextResponse.json(
    { error: 'An error occurred. Please try again.' },
    { status: 500 }
  )
}

Pasos de Verificación

  • Sin contraseñas, tokens ni secretos en los logs
  • Mensajes de error genéricos para usuarios
  • Errores detallados solo en logs del servidor
  • Sin stack traces expuestos a los usuarios

9. Seguridad en Blockchain (Solana)

Verificación de Wallet

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('Invalid recipient')
  }

  // Verificar monto
  if (transaction.amount > maxAmount) {
    throw new Error('Amount exceeds limit')
  }

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

  return true
}

Pasos de Verificación

  • Firmas de wallet verificadas
  • Detalles de transacción validados
  • Verificaciones de saldo antes de transacciones
  • Sin firma ciega de transacciones

10. Seguridad de Dependencias

Actualizaciones Regulares

# Verificar vulnerabilidades
npm audit

# Corregir problemas reparables automáticamente
npm audit fix

# Actualizar dependencias
npm update

# Verificar paquetes desactualizados
npm outdated

Archivos Lock

# SIEMPRE hacer commit de los archivos lock
git add package-lock.json

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

Pasos de Verificación

  • Dependencias actualizadas
  • Sin vulnerabilidades conocidas (npm audit limpio)
  • Archivos lock con commit
  • Dependabot habilitado en GitHub
  • Actualizaciones de seguridad regulares

Pruebas de Seguridad

Pruebas de Seguridad Automatizadas

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

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

// Probar validación de entrada
test('rejects invalid input', async () => {
  const response = await fetch('/api/users', {
    method: 'POST',
    body: JSON.stringify({ email: 'not-an-email' })
  })
  expect(response.status).toBe(400)
})

// Probar limitación de velocidad
test('enforces rate limits', 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 a producción:

  • Secretos: Sin secretos hardcodeados, todos en variables de entorno
  • Validación de Entrada: Todas las entradas del usuario validadas
  • Inyección SQL: Todas las consultas parametrizadas
  • XSS: Contenido del usuario sanitizado
  • CSRF: Protección habilitada
  • Autenticación: Manejo correcto de tokens
  • Autorización: Verificaciones de rol en su lugar
  • Limitación de Velocidad: Habilitada en todos los endpoints
  • HTTPS: Forzado en producción
  • Cabeceras de Seguridad: CSP, X-Frame-Options configurados
  • Manejo de Errores: Sin datos sensibles en errores
  • Logging: Sin datos sensibles registrados
  • Dependencias: Actualizadas, sin vulnerabilidades
  • Row Level Security: Habilitado en Supabase
  • CORS: Correctamente configurado
  • Subida de Archivos: Validada (tamaño, tipo)
  • Firmas de Wallet: Verificadas (si hay blockchain)

Recursos

  • OWASP Top 10
  • Documentación de seguridad de Next.js
  • Documentación de seguridad de Supabase
  • Web Security Academy (PortSwigger)

Recuerda: La seguridad no es opcional. Una sola vulnerabilidad puede comprometer toda la plataforma. Ante la duda, optar por el lado de la precaución.

Source repo
affaan-m/ECC
Skill path
docs/es/skills/security-review/SKILL.md
Commit SHA
4e973d3eaf92
Repository license
MIT
Data collected