Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Seguir el dato de la fuente al sumidero

5 tareas · 45 min · Principiante

Con el mapa de rutas hecho, toca seguir los datos. Un valor entra por una petición, cambia de nombre al pasar de una función a otra y termina en algún sitio donde puede hacer daño: una consulta, un comando, una redirección. Esta sala sigue uno de esos caminos en el servicio de pedidos de Artesanías Filandia, encuentra el validador que existe y no se usa, y distingue una consulta segura de una que además necesita una comprobación de permisos. Solo se leen archivos de la copia del repositorio.

0 de 5 · 0%

Objetivo de la sala

Con el mapa de rutas hecho, toca seguir los datos. Un valor entra por una petición, cambia de nombre al pasar de una función a otra y termina en algún sitio donde puede hacer daño: una consulta, un comando, una redirección. Esta sala sigue uno de esos caminos en el servicio de pedidos de Artesanías Filandia, encuentra el validador que existe y no se usa, y distingue una consulta segura de una que además necesita una comprobación de permisos. Solo se leen archivos de la copia del repositorio.

La revisión de un flujo de datos tiene tres piezas. La fuente es por donde entra un valor que controla alguien de fuera: un parámetro de la consulta, un campo del cuerpo, una cabecera, una cookie, un archivo subido. El sumidero es el punto donde ese valor se usa de una forma que puede cambiar lo que hace el programa: el texto de una consulta a la base de datos, una orden al sistema operativo, una ruta de archivo, una dirección de redirección, una plantilla. Entre las dos está el camino: las asignaciones, las llamadas y los cambios de nombre por los que pasa el valor.

Un camino deja de ser un hallazgo cuando, antes del sumidero, el valor pasa por un saneamiento adecuado a ese sumidero: convertirlo en número, compararlo con una lista cerrada de valores permitidos, pasarlo como parámetro ligado. Lo que cuenta es que la defensa corresponda al sumidero; escapar comillas no protege una ruta de archivo, y validar el formato de un correo no protege una consulta.

Responde para continuar

Un valor del cuerpo de la petición llega a una consulta, pero antes se compara con una lista cerrada de tres valores fijos. ¿Qué es?

Ver pista de ayuda

Pregúntate qué valores pueden llegar al sumidero después de la comparación.

Hay dos formas de recorrer un flujo. Desde la fuente hacia el sumidero: se toma cada valor que entra por una ruta y se sigue. O al revés: se buscan los sumideros (por ejemplo, cada consulta que se arma sumando textos) y se sube hasta ver de dónde sale lo que se suma. En la práctica se combinan; la segunda es la que más rinde cuando el código es grande, porque hay muchos menos sumideros que entradas.

En este servicio la base de datos se usa a través de api/db.js. Léelo primero: dice qué parte de una consulta viaja como parámetro ligado y qué parte se envía tal cual. Después abre el servicio de pedidos y busca la consulta que se arma sumando textos.

Responde para continuar

Escribe el nombre del parámetro de la petición que termina sumado al texto de la consulta de pedidos del cliente.

Ver pista de ayuda

Escribe `cat api/db.js` y luego `cat api/servicios/pedidos.js`. Sube desde la línea que suma textos hasta la ruta.

Un valor rara vez conserva su nombre de la ruta al sumidero: se asigna a una variable, se pasa como argumento a otra función y dentro de ella se llama de otra forma. Perder el rastro en ese cambio de nombre es el error más común al seguir un flujo a mano. La regla práctica es anotar cada salto: en qué función entra, con qué nombre, y a qué función sale.

En el informe, el hallazgo se ubica en el sumidero, porque es ahí donde se corrige, y se describe el camino completo desde la fuente para que el equipo del cliente lo reproduzca.

Responde para continuar

Escribe el nombre de la función donde el valor se suma al texto de la consulta, el sumidero de este flujo.

Ver pista de ayuda

Mira a qué función le pasa `listarMios` el valor que lee de la consulta y con qué nombre lo recibe.

El nombre de una columna o el sentido de un orden no se pueden pasar como parámetro ligado: el motor solo liga valores, no partes de la sintaxis. Para esos casos la defensa habitual es una lista cerrada de valores permitidos, comprobada antes de construir la consulta. Muchas veces esa defensa ya está escrita en el repositorio y se usa en un sitio y no en otro. Encontrarla tiene doble valor: confirma que el equipo conoce el problema y da la corrección casi hecha.

Busca en el repositorio cómo ordena la lista de pedidos del panel de administración y compara con el servicio de pedidos del cliente.

Responde para continuar

Escribe el nombre de la función de validación que el repositorio ya tiene y que el camino de los pedidos del cliente importa pero no llama.

Ver pista de ayuda

Escribe `cat api/validacion/listas.js` y luego `cat api/servicios/admin.js`; después compara con `api/servicios/pedidos.js`.

Que una consulta use parámetros ligados cierra la inyección, y nada más. El mismo valor puede ser peligroso por otra razón: si el identificador que llega en la dirección decide qué registro se devuelve, la pregunta ya no es si el motor lo interpreta como SQL, sino si el código comprueba que ese registro es del usuario que lo pide. Comparar dos funciones del mismo archivo que leen el mismo tipo de registro suele delatarlo.

Responde para continuar

verPedido busca el pedido con el id como parámetro ligado; cancelarPedido busca con el id y con el cliente de la sesión. ¿Qué anotas?

Ver pista de ayuda

Separa la pregunta del motor («¿esto es SQL?») de la pregunta del negocio («¿esto es tuyo?»).

Inicia sesión para registrar tus puntos y progreso en el ranking.

Whoami-Labs Pro

Whoami-Labs Pro utiliza cookies

Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad