Usa una lista de verificación de seguridad de Claude Code para realizar comprobaciones rápidas y concretas sobre autenticación, validación de entradas, manejo de secretos y superficies de inyección en aplicaciones web.

Una comprobación ligera de seguridad es una revisión rápida (a menudo 30–60 minutos) pensada para detectar problemas obvios y de alto impacto antes de que se publiquen. No es una auditoría completa. Piénsalo como un recorrido de seguridad: repasas las rutas que fallan con más frecuencia en apps reales y buscas pruebas, no suposiciones.
Esta lista de verificación de seguridad de Claude Code se centra en las áreas que más se rompen en aplicaciones web cotidianas:
No pretende probar la ausencia de bugs, modelar actores de amenaza complejos ni sustituir pruebas de penetración.
“Hallazgos concretos” significa que cada problema que documentes tiene evidencia que un desarrollador puede usar de inmediato. Para cada hallazgo, captura:
La IA es una ayuda, no una autoridad. Úsala para buscar, resumir y proponer pruebas. Luego verifica leyendo el código y, cuando sea posible, reproduciendo con una petición real. Si el modelo no puede señalar ubicaciones y pasos específicos, trata la afirmación como no probada.
Una revisión rápida solo funciona si delimitas el objetivo. Antes de pedirle a Claude Code que mire algo, decide qué intentas probar hoy y qué no vas a revisar.
Empieza con 1 a 3 recorridos de usuario reales donde los errores cuesten dinero, expongan datos o otorguen poder. Buenos candidatos son login, restablecimiento de contraseña, checkout y pantallas de edición de admin.
Luego nombra los activos que debes proteger. Sé específico: cuentas de usuario, acciones de pago, datos personales, operaciones solo para admin.
Después escribe tus supuestos de amenaza en palabras simples. ¿Te defiende contra un usuario curioso que hace clic, un atacante externo con scripts o un insider con cierto acceso? Tu respuesta cambia qué significa “suficiente”.
Finalmente, define criterios de aprobado y fallado para que la comprobación termine con hallazgos, no impresiones. Reglas simples funcionan bien:
Si no puedes describir cómo se ve un fallo, el alcance sigue siendo demasiado vago.
Una comprobación solo funciona si el modelo mira en los lugares correctos. Reúne un pequeño paquete de código y notas para que la revisión produzca evidencia, no suposiciones.
Empieza compartiendo la ruta crítica de seguridad: puntos de entrada de la petición y el código que decide quién es el usuario y qué puede hacer. Incluye el código suficiente alrededor para mostrar cómo fluye la información.
Un paquete práctico suele incluir:
Agrega unas líneas de notas de entorno para dejar explícitos los supuestos: sesión vs JWT, dónde viven los tokens (cookie o header), comportamiento del reverse proxy o API gateway, workers/colas/cron y cualquier endpoint “solo interno”.
Antes de buscar bugs, pide un inventario: puntos de entrada, endpoints privilegiados y almacenes de datos tocados. Esto evita superficies olvidadas.
También acuerda un formato de salida que obligue a hallazgos concretos. Una tabla simple funciona bien: Hallazgo, Severidad, Endpoint/archivo afectado, Evidencia (fragmento exacto o rango de líneas), Escenario de explotación, Sugerencia de arreglo.
Cronometra:
El objetivo no es cobertura perfecta. Es un pequeño conjunto de hallazgos comprobables.
Mantén la app abierta mientras lees. Haz clic en la UI y observa qué peticiones se disparan. Las notas deben apuntar a endpoints específicos, parámetros y fuentes de datos.
Un flujo que cabe en una sola sesión:
Un hábito útil: por cada “parece bien”, escribe cómo lo romperías. Si no puedes describir un intento de ruptura, probablemente no lo verificaste.
La autenticación es donde la app decide “esta petición pertenece a esta persona”. Una comprobación rápida no consiste en leer cada línea. Se trata de encontrar el lugar donde se establece la identidad y luego revisar atajos y caminos de fallo.
Localiza el límite de confianza: ¿dónde se crea o acepta la identidad por primera vez? Puede ser una cookie de sesión, un token JWT bearer, una API key o mTLS en el borde. Pide a Claude Code que señale el archivo y la función exactos que convierten “anónimo” en un id de usuario, y que liste cada otro camino que pueda hacer lo mismo.
Chequeos de authn que vale la pena escanear:
Un ejemplo práctico: si los emails de restablecimiento devuelven “cuenta no encontrada”, eso es un problema rápido de enumeración. Incluso con un mensaje genérico, diferencias en el tiempo de respuesta pueden filtrar lo mismo, así que revisa tiempos también.
La autorización es la pregunta que causa más daño cuando falla: “¿Puede este usuario hacer esta acción sobre este recurso exacto?” Una comprobación rápida debe intentar romper esa suposición a propósito.
Escribe roles y permisos en lenguaje llano. Manténlo humano:
Luego verifica que cada acción sensible aplique authz en el servidor, no solo en la UI. Los botones pueden estar ocultos, las rutas bloqueadas en el cliente, pero un atacante puede llamar la API directamente.
Un escaneo rápido que suele encontrar problemas reales:
El olor clásico de IDOR es sencillo: una petición como GET /projects/{id} donde {id} la controla el usuario y el servidor la carga sin verificar que pertenezca al usuario o tenant actual.
Un prompt que fuerza una respuesta real:
“Para este endpoint, muestra el código exacto que decide el acceso, y lista las condiciones específicas que permitirían que un usuario de otra orgId lo acceda. Si no hay, explica por qué con nombres de archivo y función.”
La mayoría de los problemas rápidos en apps web empiezan por un hueco: la app acepta entradas que el desarrollador no esperaba. Trata “entrada” como cualquier cosa que un usuario u otro sistema pueda influenciar, aunque parezca inocua.
Empieza nombrando las entradas para el endpoint que estás revisando:
La validación debe ocurrir cerca de donde los datos entran en la app, no dentro de la lógica de negocio. Revisa lo básico: tipo (string vs número), longitud máxima, requerido vs opcional y formato (email, UUID, fecha).
Para valores conocidos como roles, campos de estado o direcciones de ordenación, prefiere una whitelist. Es más difícil de eludir que “bloquear algunos valores malos”.
También revisa el manejo de errores. Si la app rechaza una entrada, no reimprimas el valor crudo en la respuesta, logs o UI. Ahí es donde pequeños bugs de validación se convierten en fugas de datos o ayudas para inyección.
Un mini-plan de “entrada mala” para endpoints riesgosos (login, búsqueda, upload, acciones admin):
Ejemplo: un parámetro de ordenación que acepta cualquier string puede convertirse en un fragmento SQL. Una whitelist como "date" o "price" evita esa clase de error temprano.
La mayoría de las revisiones rápidas encuentran problemas en los mismos lugares: donde la entrada del usuario se interpreta como código, consulta, ruta o URL. Aquí cazas momentos en que “la entrada cruza un límite de confianza”.
Traza datos desde puntos de entrada (query params, headers, cookies, uploads, formularios de admin) hasta donde terminan.
Busca estos patrones y exige un sitio de llamada concreto y un ejemplo de payload para cada uno:
ORDER BY dinámico y constructores IN (...) que unen valores de usuarioconvert que reciben flags controlados por el usuarioTambién vigila deserialización e inyección en plantillas. Cualquier cosa que parsee JSON, YAML o strings con plantillas proporcionadas por el usuario puede esconder comportamiento riesgoso, sobre todo si soporta tipos personalizados, expresiones o renderizado del lado servidor.
Si una función acepta una URL, un nombre de archivo o texto formateado, asume que puede ser abusada hasta que pruebes lo contrario con rutas de código y tests.
Los problemas con secretos suelen ser ruidosos una vez que sabes dónde buscar. Concéntrate en dónde viven los secretos y dónde pueden copiarse accidentalmente.
Lugares comunes donde aparecen secretos:
Luego fuerza una respuesta concreta: si un secreto está expuesto hoy, ¿qué pasa después? Un buen sistema tiene un camino de rotación (se emite una clave nueva), revocación (se deshabilita la vieja) y forma de redeploy rápido. Si la respuesta es “lo cambiaríamos después”, trata eso como un hallazgo.
El principio de menor privilegio es otra mejora rápida. Los incidentes empeoran porque las claves tienen demasiado poder. Busca usuarios de BD que puedan dropear tablas, tokens de terceros que puedan gestionar cuentas o API keys compartidas entre entornos. Prefiere una clave por servicio, por entorno, con el conjunto mínimo de permisos.
Prompts rápidos para pegar en Claude Code:
Finalmente, confirma guardarraíles: evita secretos en control de versiones (pre-commit/CI checks) y asegúrate de que backups o snapshots no incluyan credenciales en texto plano. Si la plataforma soporta snapshots y rollback, verifica que los secretos se inyecten en tiempo de ejecución, no se horneen en imágenes guardadas.
Prompts vagos devuelven respuestas vagas. Obliga al modelo a comprometerse con evidencia: ubicaciones exactas, un rastro que puedas seguir, un repro que puedas ejecutar y qué haría que la afirmación fuera falsa.
Usa un patrón a la vez y pídeles que revisen tras que confirmes o rechaces un detalle.
Si la salida sigue siendo difusa, acótala:
“Contesta solo con: ruta de archivo, nombre de función, línea riesgosa y un impacto en una frase.”
Los endpoints de actualización de perfil suelen esconder fallos de control de acceso. Aquí tienes un caso pequeño que puedes recorrer con esta lista.
Escenario: un endpoint API actualiza un perfil de usuario:
PATCH /api/profile?accountId=123 con JSON como { "displayName": "Sam" }.
Le pides a Claude Code que encuentre el handler, trace cómo se usa accountId y pruebe si el servidor aplica la propiedad.
Lo que suele aparecer:
accountId de la query y actualiza esa cuenta sin comprobar que coincida con el usuario autenticado.displayName se recorta, pero accountId no se valida como entero."... WHERE account_id=" + accountId.Un buen informe es concreto:
accountId; el SQL se construye con entrada no fiableaccountId del cliente, usar el id de cuenta autenticado en el servidor; parametrizar la consultaaccountId no numéricoTras parchear, vuelve a chequear rápido:
accountId y confirma que falla.La forma más rápida de perder una vulnerabilidad es confiar en lo que parece imponer la UI. Un botón oculto o deshabilitado no es una comprobación de permiso. Si el servidor acepta la petición, cualquiera puede reproducirla con otro ID de usuario, otro rol o una llamada API directa.
Otro fallo común es pedir algo vago. “Haz una revisión de seguridad” suele producir un informe genérico. Una comprobación necesita un alcance ajustado (qué endpoints, qué roles, qué datos) y un formato de salida estricto (nombre de archivo, función, línea riesgosa, repro mínimo).
La misma regla aplica a la salida de IA: no aceptes afirmaciones sin referencias. Si un hallazgo no incluye una ubicación de código concreta y una forma paso a paso de activarlo, trátalo como no probado.
Estas trampas aparecen una y otra vez:
Si te sorprendes añadiendo más filtros tras cada nuevo caso límite, pausa. El arreglo suele estar antes y es más simple: valida en el borde y centraliza las comprobaciones de autorización para que cada camino de código las use.
Esto no sustituye una revisión completa, pero captura errores que se cuelan cuando todos están cansados. Manténlas enfocadas en lo que puedes probar rápido: una petición que puedas enviar, una página que puedas cargar, una línea de log que puedas encontrar.
Cinco comprobaciones rápidas que suelen dar resultado:
Authorization: Bearer. Revisa páginas de error también. “Solo estaba en staging” suele convertirse en “se publicó”.Apunta las 3 mejores correcciones que puedes publicar esta semana, no una lista de deseos. Ejemplo: (1) añadir rate limiting a login y reset, (2) imponer comprobaciones de propiedad server-side en el endpoint “get by id”, (3) limitar longitud de entrada y rechazar caracteres inesperados en el campo de búsqueda.
Una comprobación solo paga si los resultados cambian lo que se publica. Trata esta lista como un paso pequeño y repetible de build, no una misión de rescate única.
Convierte cada hallazgo en un ítem de backlog que sea difícil de malinterpretar:
Elige una cadencia que cuadre con tu riesgo y tamaño de equipo. Para muchos equipos, cada release es lo ideal. Si las releases son frecuentes, haz una revisión de 30–60 minutos mensual y una comprobación más corta antes de publicar.
Hazlo más fácil de repetir creando un paquete de prompts reutilizable y una plantilla de checklist. Mantén los prompts enfocados en salidas concretas: muestra la ruta, la protección, la petición que falla y el comportamiento esperado. Guarda el paquete donde tu equipo ya trabaje para que no se salte.
Si construyes apps a través de chat, integra la lista en la planificación. Añade una breve nota de “supuestos de seguridad” para authn/authz, entradas y secretos, y ejecuta la comprobación justo después de la primera versión funcional.
Plataformas como Koder.ai (koder.ai) pueden encajar bien con este hábito porque permiten iterar rápido manteniendo puntos de revisión. Usar snapshots y rollback alrededor de cambios riesgosos facilita publicar correcciones de seguridad sin quedar bloqueado cuando algo rompe comportamiento.