Revisar código es leer un cambio buscando fallos
La revisión de código es leer el trabajo de otra persona antes de aceptarlo, para encontrar fallos de seguridad cuando todavía es barato arreglarlos. Con una lista de comprobación, una revisión es más rápida y más fiable.
Una academia en línea recibe un cambio que añade un buscador. Quien lo revisa decide si entra o vuelve a su autor.
Al final de esta lección
Nota
Puedo revisar un cambio de código con una lista de comprobación y señalar las líneas de riesgo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Revisión de código | lectura de un cambio por otra persona | |
| Diff | lista de líneas quitadas y añadidas | + nueva línea |
| Lista de comprobación | preguntas que se repiten en cada revisión | |
| Línea de riesgo | línea que puede causar un fallo de seguridad | |
| Falso positivo | aviso que no era un fallo real |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una lista de comprobación evita olvidar preguntas
Quien revisa se cansa y se olvida de cosas. Una lista fija hace las mismas preguntas en cada cambio. Cada pregunta viene de una lección de este módulo.
No hace falta entender todo el programa. Hace falta mirar los sitios donde el programa recibe datos, guarda secretos o decide permisos.
Ejemplo resuelto: la lista y qué buscar
| Pregunta | Qué buscar en el código | Lección |
|---|---|---|
| ¿Se comprueba la entrada? | Datos usados sin ninguna comprobación | Validar la entrada |
| ¿Se monta una consulta con texto? | Un SELECT con signos + o texto pegado | Consultas con parámetros |
| ¿Hay secretos? | Claves y contraseñas escritas entre comillas | Dependencias y secretos |
| ¿Cómo se guardan las claves? | Hashes débiles o texto plano | Contraseñas y sesiones |
| ¿Qué ocurre si falla? | Errores mostrados al usuario | Diseño seguro |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Primero se leen las líneas añadidas
Un diff muestra lo que cambia. Las líneas con - se quitan y las que llevan + se añaden. Lo nuevo es lo que puede traer fallos.
Lee cada línea añadida con la lista en la mano. Si una te sorprende, pregunta a su autor: puede que tenga una razón.
Un cambio para revisar (ejemplo inventado)
# Ejemplo inventado: un cambio que añade un buscador a una academia.
- def search(term):
- return []
+ def search(term):
+ db_password = "academia2024"
+ order = "SELECT name FROM courses WHERE name = '" + term + "'"
+ return run(order, db_password)
Dos líneas añadidas son de riesgo
En el cambio anterior, la línea con db_password guarda una contraseña entre comillas en el código. Eso es un secreto en el código.
La línea con order monta una consulta sumando texto del usuario. Eso es una inyección posible. La línea del return no es un fallo por sí sola.
Oriéntate antes de leer la tienda
Un buen revisor se orienta antes de leer línea a línea. Ejecuta estos tres comandos en tu laboratorio. Solo miran. Cuentan las importaciones, las funciones y los sitios que atrapan errores del programa original de la tienda.
La regla única
Advertencia
Mira solo tu copia privada del laboratorio, que no tiene salida a internet. Probar un sistema ajeno, o sin permiso, es delito en casi todos los países.
Cuántas líneas importan módulos
docker exec app grep -c "import" /tmp/app/app.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuántas funciones define
docker exec app grep -c "def " /tmp/app/app.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuántos sitios atrapan un error
docker exec app grep -c "except" /tmp/app/app.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué te dicen las tres respuestas
El primero imprime 3: tres módulos importados. El segundo imprime 5: cinco funciones. El tercero imprime 1: un solo sitio atrapa errores. Si alguien ya editó el programa, los números pueden cambiar.
Con cinco funciones, el revisor empieza por la que recibe datos y la que habla con la base.
Un error frecuente
Advertencia
Mucha gente cree que una herramienta que no avisa de nada garantiza que el código es seguro. No es así. Una herramienta solo busca lo que conoce y también da falsos positivos. Úsala como ayuda y lee tú el código con la lista.