Codificación Segura de Aplicaciones Web
Convierte OWASP Top 10:2025, ASVS 5.0, la Serie de Cheat Sheets y material seleccionado de WSTG en una guía práctica de seguridad para aplicaciones web.
Por defecto (en línea): escribe código seguro de forma silenciosa; marca solo el problema de mayor impacto que veas cerca.
Auditoría: con "revisar", "auditar", "endurecer", "¿esto es seguro?" o seguimiento de incidentes — lee assets/audit-checklist.md y produce hallazgos priorizados.
Modos, invocados como $secure-webapp <modo>:
$secure-webapp audit: revisión priorizada completa; leeassets/audit-checklist.md.$secure-webapp quick-check: solo pase de mayor riesgo: autorización, autenticación/sesión, secretos, inyección/XSS, subidas, SSRF, tokens. Sin informe de lista de verificación completo.$secure-webapp harden: aplica cambios seguros directamente donde las ediciones estén autorizadas; parches pequeños que preserven la arquitectura; verifica y marca cualquier cosa que necesite aprobación del producto.$secure-webapp remediate: ciclo iterativo auditoría→arreglo; leeassets/remediate-checklist.mdcompleto primero.$secure-webapp design-review: modelo de amenazas previo a la implementación: suposiciones, límites de confianza, casos de abuso, controles imprescindibles, preguntas sin resolver.$secure-webapp report: escribe un informe formal endocs/security-audit-report-YYYY-MM-DD.md; leeassets/report-template.mdcompleto primero y sigue cada paso. Requiere una auditoría previa en esta sesión. Escribe en el archivo, nunca en el chat.$secure-webapp update: autoactualiza esta instalación ejecutandonpx --yes github:hov172/secure-webapp-skill --global. Verifica la versión y solo reinstala cuando existe una versión más reciente. Banderas:--claude/--codex/--gemini,--check,--force.$secure-webapp maintain: actualiza el paquete de la habilidad en sí, desde un clon del repositorio fuente — consultascripts/README.md.
Carga solo las referencias que la tarea necesite. Nunca las cargues todas a la vez.
Enrutamiento
| La tarea involucra | Cargar |
|---|---|
| Cadenas no confiables interpretadas como HTML/DOM/SQL/shell/NoSQL/LDAP/regex/CSV | references/input-handling.md |
| Inicio de sesión, registro, contraseñas, MFA, restablecimiento, fuerza bruta, sesiones, cookies, cierre de sesión | references/auth-and-sessions.md |
| Permisos, roles, comprobaciones de propiedad, IDOR, aislamiento de inquilinos | references/authorization.md |
| JWTs, tokens de API/refresco, firma y verificación, OAuth/OIDC, PKCE, estado | references/tokens-and-oauth.md |
| Endpoints REST/GraphQL/WebSocket, límites de tasa, asignación masiva, forma de la respuesta, subidas/descargas, path traversal, URLs prefirmadas | references/apis-and-files.md |
| Secure/HttpOnly/SameSite, CSP, CORS, CSRF, encabezados, iframes, postMessage | references/frontend-and-headers.md |
Variables de entorno, .env, claves, gestor de secretos, modo debug, valores predeterminados | references/secrets-and-config.md |
| Cifrado, hash de contraseñas, algoritmos, gestión de claves, PII | references/data-and-crypto.md |
| Dependencias, lockfiles, SBOM, CI/CD, GitHub Actions, artefactos firmados | references/supply-chain.md |
| URLs externas controladas por el usuario, SSRF, condiciones de carrera, deserialización, contaminación de prototipos | references/secure-coding.md |
| Registro, respuestas de error, trazas de pila, pistas de auditoría, fail-closed, reversión | references/logging-and-errors.md |
| Diseño de nuevas funciones, modelado de amenazas, multiinquilinato, decisiones seguras por diseño | references/insecure-design.md |
| Funciones de LLM/IA, construcción de prompts, RAG, llamadas a herramientas de agente, servidores MCP, salida del modelo renderizada o ejecutada | references/ai-and-llm.md |
Lista de Verificación Siempre Activa
Señala estos de pasada cuando los veas en código web, con una solución concreta:
- Faltan comprobaciones de autorización/autenticación del lado del servidor en rutas de recursos. Prefiere ámbito a nivel de consulta como
WHERE owner_id = :current_user. - Secretos, credenciales, secretos JWT, claves de API, o archivos
.envcomprometidos en el código. - Consultas SQL/NoSQL/shell construidas con cadenas. Usa consultas parametrizadas, constructores seguros o APIs argv.
- Contraseñas en texto plano o con hash rápido. Usa argon2id, scrypt o bcrypt; PBKDF2 solo donde sea necesario.
- Verificación JWT con algoritmos no fijados, comprobaciones de
exp/iss/audfaltantes, o secretos en el código. dangerouslySetInnerHTML,v-html, oinnerHTMLcon contenido de usuario. Renderiza como texto o desinfecta.- CORS con credenciales y origen comodín o reflejado. Usa una lista blanca estricta.
- Límites de tasa faltantes en inicio de sesión, registro, restablecimiento, MFA/OTP, o endpoints costosos.
- Errores de producción verbosos, trazas de pila, detalles de SQL/ORM, o modo debug expuesto a los clientes.
- Redirecciones abiertas desde parámetros
next,returnTo, o URL no validados. - SSRF desde URLs proporcionadas por el usuario sin listas blancas y bloqueo de IPs privadas después de DNS y redirecciones.
- Registros que contienen contraseñas, tokens, IDs de sesión, secretos, o PII innecesaria.
- Controles de seguridad solo del lado del cliente: campos ocultos, botones deshabilitados, roles de cliente, validación solo en frontend.
- Subidas de archivos sin controles de tamaño, tipo, ruta, almacenamiento, o nombre generado.
- Rutas de excepción fail-open alrededor de autenticación, autorización, límites de tasa, flags de funcionalidad o transacciones.
- Cambios de estado no atómicos en saldo, cuota, pago, inventario, cupón, o token de un solo uso.
- Salida del modelo/LLM que llega a un sink sin verificar —
innerHTML, shell, SQL, rutas de archivo, URLsfetch, o un agente descendente. Trátala como entrada no confiable. - Llamadas a herramientas de agente autorizadas contra la cuenta de servicio en lugar del usuario final, o herramientas genéricas
run_shell/execute_sql/http_requestque convierten la inyección de prompts en RCE, SQLi o SSRF. - Texto no confiable concatenado en un prompt del sistema; secretos o datos de otros usuarios en el contexto del modelo.
- Referencias mutables de dependencias o acciones de CI donde se esperan pinning y lockfiles: una etiqueta movida ejecuta código del atacante en ese trabajo con los secretos de ese trabajo. Califica como Alto cuando el trabajo tiene credenciales de despliegue, claves de firma o derechos de publicación; igual para credenciales de nube de larga duración donde existe OIDC. Audita cada espacio de trabajo en un monorepo y marca un
--audit-levelinferior ahigh.
Comportamiento
- Escribe código seguro por defecto, sin explicaciones largas. Nombra las decisiones de seguridad relevantes brevemente cuando sea útil.
- Ajusta el rigor según la importancia de la aplicación; no impongas controles empresariales en prototipos desechables.
- Nunca generes código intencionalmente inseguro. Ofrece la alternativa segura y explica la restricción en una frase.
- Para nuevas funciones que crucen límites de confianza, verifica: entrada no confiable, autorización, modo de fallo, datos almacenados, ruta de abuso.
- Al auditar, inspecciona código real, haz solo preguntas de alcance esenciales, e informa gravedad + ubicación + evidencia + corrección, priorizados.
- No cites números de requisitos de OWASP a menos que se te pida.
- No pretendas realizar pruebas de penetración; esto es revisión de código y diseño.
Alcance
Stacks web principales — Next.js, Express, Django, Flask, FastAPI, Rails, Spring, Laravel, Go y similares. Para áreas especializadas que las referencias no cubren, indícalo y apunta a la fuente relevante de OWASP en lugar de adivinar.
Agnóstico al agente: funciona en Claude Code, Codex, Gemini CLI y cualquier otra herramienta que cargue habilidades o lea AGENTS.md/GEMINI.md. Cuando este archivo nombre una herramienta, usa el equivalente de tu entorno.