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.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
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.
origin
ECC
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 hardcodeadoconst dbPassword = "password123"// En el código fuente
PASA: SIEMPRE Hacer Esto
const apiKey = process.env.OPENAI_API_KEYconst dbUrl = process.env.DATABASE_URL// Verificar que los secretos existen
(!apiKey) {
()
}
if
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)
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 SQLconst query = `SELECT * FROM users WHERE email = '${userEmail}'`await db.query(query)
PASA: SIEMPRE Usar Consultas Parametrizadas
// Seguro - consulta parametrizadaconst { data } = await supabase
.from('users')
.select('*')
.eq('email', userEmail)
// O con SQL puroawait 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
exportasyncfunctiondeleteUser(userId: string, requesterId: string) {
// SIEMPRE verificar la autorización primeroconst requester = await db.users.findUnique({
where: { id: requesterId }
})
if (requester.role !== 'admin') {
returnNextResponse.json(
{ error: 'Unauthorized' },
{ status: 403 }
)
}
// Proceder con la eliminaciónawait db.users.delete({ where: { id: userId } })
}
Row Level Security (Supabase)
-- Habilitar RLS en todas las tablasALTER TABLE users ENABLE ROW LEVEL SECURITY;
-- Los usuarios solo pueden ver sus propios datosCREATE POLICY "Users view own data"
ON users FORSELECTUSING (auth.uid() = id);
-- Los usuarios solo pueden actualizar sus propios datosCREATE POLICY "Users update own data"
ON users FORUPDATEUSING (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
importDOMPurifyfrom'isomorphic-dompurify'// SIEMPRE sanitizar HTML proporcionado por el usuariofunctionrenderUserContent(html: string) {
const clean = DOMPurify.sanitize(html, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
ALLOWED_ATTR: []
})
return<divdangerouslySetInnerHTML={{__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.