From 29afd89a44c9e9176f8bce80ca3f9081c7e8b5ca Mon Sep 17 00:00:00 2001 From: Joel Alvarez Date: Mon, 27 Jul 2026 13:54:22 -0700 Subject: [PATCH] docs: add API security exercises --- Cargo.toml | 4 ++++ benches/09-seguridad-de-apis.md | 11 ++++++++++ benches/README.md | 1 + docs/09-seguridad-de-apis.md | 20 ++++++++++++++++-- docs/ejercicios/09-seguridad-de-apis.md | 23 +++++++++++++++++++++ docs/ejercicios/README.md | 1 + examples/soluciones/09-seguridad-de-apis.rs | 17 +++++++++++++++ 7 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 benches/09-seguridad-de-apis.md create mode 100644 docs/ejercicios/09-seguridad-de-apis.md create mode 100644 examples/soluciones/09-seguridad-de-apis.rs diff --git a/Cargo.toml b/Cargo.toml index 3ffd9dd..7b54af5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,3 +42,7 @@ path = "examples/soluciones/07-operacion-de-apis.rs" [[example]] name = "08-identidad-y-acceso-solucion" path = "examples/soluciones/08-identidad-y-acceso.rs" + +[[example]] +name = "09-seguridad-de-apis-solucion" +path = "examples/soluciones/09-seguridad-de-apis.rs" diff --git a/benches/09-seguridad-de-apis.md b/benches/09-seguridad-de-apis.md new file mode 100644 index 0000000..9a2c555 --- /dev/null +++ b/benches/09-seguridad-de-apis.md @@ -0,0 +1,11 @@ +# Decisión de benchmark: seguridad de APIs + +**Estado:** draft + +No se agrega benchmark ejecutable. El modelo evalúa una regla de frontera en +memoria; medirla no decide si una API valida suficiente, expone datos de más o +resiste abuso en producción. + +Un benchmark será pertinente cuando una defensa real plantee una decisión +reproducible, como el costo de validación de esquemas bajo carga o un límite de +solicitudes frente a tráfico automatizado. diff --git a/benches/README.md b/benches/README.md index 74da628..0661232 100644 --- a/benches/README.md +++ b/benches/README.md @@ -12,3 +12,4 @@ documentadas por capítulo. - [06. Estilos alternativos](06-estilos-alternativos.md) - [07. Operación de APIs](07-operacion-de-apis.md) - [08. Identidad y acceso](08-identidad-y-acceso.md) +- [09. Seguridad de APIs](09-seguridad-de-apis.md) diff --git a/docs/09-seguridad-de-apis.md b/docs/09-seguridad-de-apis.md index 476603c..24322bd 100644 --- a/docs/09-seguridad-de-apis.md +++ b/docs/09-seguridad-de-apis.md @@ -126,10 +126,26 @@ Las pruebas aceptan una frontera sensible con mensaje seguro, rechazan detalles internos y rechazan entradas extensas. No sustituyen un análisis de amenazas; protegen la condición mínima que evita exponer una frontera interna. +## Práctica + +Los ejercicios están en +[`docs/ejercicios/09-seguridad-de-apis.md`](ejercicios/09-seguridad-de-apis.md) +y la solución ejecutable en +[`examples/soluciones/09-seguridad-de-apis.rs`](../examples/soluciones/09-seguridad-de-apis.rs). +Antes de consultar la solución, identifica qué dato sensible protege la +frontera y qué información nunca debe aparecer en el error público. + +## Benchmark + +La decisión de benchmark está en +[`benches/09-seguridad-de-apis.md`](../benches/09-seguridad-de-apis.md). +El modelo valida reglas pequeñas en memoria; medirlo no decide una amenaza ni +la eficacia de una defensa en producción. + ## Siguiente paso -El siguiente bloque añadirá práctica, solución ejecutable y una decisión de -benchmark. Después el curso cerrará con estrategia de APIs para sistemas reales. +El siguiente capítulo cierra el curso con estrategia de APIs para sistemas +reales. ## Decisiones registradas diff --git a/docs/ejercicios/09-seguridad-de-apis.md b/docs/ejercicios/09-seguridad-de-apis.md new file mode 100644 index 0000000..daec0a0 --- /dev/null +++ b/docs/ejercicios/09-seguridad-de-apis.md @@ -0,0 +1,23 @@ +# Ejercicios: seguridad de APIs + +**Estado:** draft + +## Ejercicio 1: localizar la frontera + +Para una entrada de importe, identifica qué debe validarse antes de ejecutar +la operación, qué detalle no debe regresar al consumidor y qué señal puede +registrarse sin conservar datos sensibles. + +## Ejercicio 2: declarar un rechazo seguro + +Construye una frontera para `importe` con sensibilidad `Sensitive` y +`SafeMessage`. Explica por qué un detalle interno puede ayudar al atacante aun +cuando el valor de entrada parece válido. + +## Ejercicio 3: solución ejecutable + +Compila la frontera segura con: + +```sh +cargo run --example 09-seguridad-de-apis-solucion +``` diff --git a/docs/ejercicios/README.md b/docs/ejercicios/README.md index 12c296c..2323a46 100644 --- a/docs/ejercicios/README.md +++ b/docs/ejercicios/README.md @@ -12,3 +12,4 @@ después de justificar el diseño propio. - [06. Estilos alternativos](06-estilos-alternativos.md) - [07. Operación de APIs](07-operacion-de-apis.md) - [08. Identidad y acceso](08-identidad-y-acceso.md) +- [09. Seguridad de APIs](09-seguridad-de-apis.md) diff --git a/examples/soluciones/09-seguridad-de-apis.rs b/examples/soluciones/09-seguridad-de-apis.rs new file mode 100644 index 0000000..130cc77 --- /dev/null +++ b/examples/soluciones/09-seguridad-de-apis.rs @@ -0,0 +1,17 @@ +//! Solución del ejercicio del capítulo 9. + +use rust_api_design::security_boundary::{DataSensitivity, ErrorExposure, SecurityBoundary}; + +fn main() -> Result<(), Box> { + let boundary = SecurityBoundary::new( + "importe", + DataSensitivity::Sensitive, + ErrorExposure::SafeMessage, + )?; + + println!( + "¿Entrada extensa rechazada? {}", + boundary.rejects(&"x".repeat(129)) + ); + Ok(()) +}