<style scoped>
.h2, h2 {
color: #ffc111 !important;
background: #ccc2;
font-weight: bolder !important;
border-radius: 20px;
font-size: 80px !important;
margin: 30px -40px !important;
}
.secondary, strong {
color: #ffc111 !important;
}
.reveal .alert {
font-size: 22px;
padding: 0;
}
.reveal h2 {
text-align:center;
font-size: 50px;
color: #fd3;
margin-bottom: 8px;
}
p.part {
text-align: left;
font-size: 25px;
}
.reveal .code-wrapper {
border-radius: 4px;
width: 100%;
}
.code-wrapper > *::-moz-selection {
color: #222;
background: #fd3;
}
.path {
color: #fd3;
}
.comando {
background: #333;
border-radius: 4px;
padding: 0 6px 3px 6px;
}
.comando::before {
content: "> "
}
.language-bash::before {
content: "$ "
}
.language-dos::before {
content: "> "
}
.irb {
background: #282828;
border-radius: 4px;
padding: 0 6px 3px 6px;
}
.irb::before {
content: "irb(main):001:0> ";
color: #2f3;
}
.code-wrapper > *::selection,
.hljs-tag::selection,
.hljs-tag > *::selection,
.hljs-symbol::selection,
.language-ruby > *::selection,
.hljs > *::selection,
.hljs-ln-code::selection,
.hljs-ln-code > *::selection,
.hljs-ln-code > * > *::selection,
.hljs-ln-code > * > * > *::selection,
.hljs-class > *::selection,
.comando > *::selection,
.irb > *::selection{
color: #222;
background: #fd3;
}
.reveal .code-wrapper code {
white-space: pre;
font-size: 29px;
line-height: 34px;
max-height: 100vh;
}
pre.flow-chart, pre.sequence-diagram, pre.graphviz, pre.mermaid, pre.abc, pre.vega {
background: #222;
border-bottom: 1px solid #ccc;
width: 100%;
}
img {
width: 100%;
margin: 0 !important;
}
.reveal ul, .reveal ol {
text-align: left !important;
font-size: 28px;
}
.reveal ul {
list-style: square;
}
.reveal ul li::marker {
font-size: 30px;
}
.reveal table.part, .reveal table.part td {
font-size: 19px;
border: 1px solid #ffc111;
}
.reveal table th {
background: #ffc111 !important;
color: #191919;
}
.reveal blockquote {
border-radius: 1.2%;
width: 100%;
padding: 1.2%;
box-shadow: 2px 1px 8px #333;
}
</style>
<!-- NOTAS:
Para poner pantalla completa, haz lo siguiente:
Mac: opt + f
Windows: f10
-->
<!-- .slide: data-transition="fade-in convex-out" -->
<!-- .slide: data-background="linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url('https://exchange.nottingham.ac.uk/content/uploads/Information-security-video-WIDEBANNER.png') center/cover no-repeat" data-background-color="#000" -->
## SafeSystem <br><i class="fa fa-shield text-white"></i> Consulting
__Francisco Santander__
Asesor Principal
__Mauro Valdivía__
Analista de Seguridad
__Marco Contreras__
Asesor Técnico
---
<!-- .slide: data-transition="fade-in convex-out" -->
<!-- .slide: data-background="linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.9)), url('https://predatech.co.uk/wp-content/uploads/2021/06/OWASP-Blog-min.png') center/cover no-repeat" data-background-color="#000" -->
### __¿Por qué hablar de Desarrollo Seguro hoy?__
- <!-- .element: class="fragment" data-fragment-index="1" -->La seguridad en el software <strong>ya no es opcional</strong>.
- <!-- .element: class="fragment" data-fragment-index="2" --> <strong>Aumento de ciberataques</strong> dirigidos.
- <!-- .element: class="fragment" data-fragment-index="3" --> <span><!-- .element: class="fragment highlight-green" -->Desarrollar con seguridad desde el inicio es más barato</span> que corregir después.
---
<!-- .slide: data-transition="zoom" -->
<!-- .slide: style="text-align: left" -->
<!-- .slide: data-background="linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.9)), url('https://predatech.co.uk/wp-content/uploads/2021/06/OWASP-Blog-min.png') center/cover no-repeat" data-background-color="#000" -->
### __Principales riesgos en aplicaciones web__
La OWASP ( <span style="color: #cc9">Open Worldwide Application Security Project</span> ) publica cada 2-3 años su lista "__Top 10__", que resume los riesgos más críticos basados en:
- Análisis de datos reales de escaneos y pruebas.
- Contribuciones de expertos globales
- Impacto, probabilidad de explotación y detectabilidad.
---
<!-- .slide: data-background="linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.7)), url('https://hapleafacademy.com/wp-content/uploads/2024/01/3047867-1-scaled.jpg') center/cover no-repeat" data-background-color="#000" -->
<h3 style="display: flex; align-items: center; justify-content: center"><svg xmlns="http://www.w3.org/2000/svg" width="70" height="80" viewBox="0 0 24 24"><path fill="#fffcfc" d="M15.897 20.503c-.384 0-1.782-2.489-1.97-3.198c-.393-1.486-.308-2.114-.285-2.314c.072-.613.667-.92.703-1.748c.01-.256.14-1.535.243-2.534a1.7 1.7 0 0 1-.733-.343c.676.908-.32 1.995-1.767 3.443c-1.536 1.536-4.945 2.961-4.945 2.961s1.425-3.41 2.961-4.945c1.13-1.129 2.04-1.983 2.816-1.983c.22 0 .427.067.627.216a1.7 1.7 0 0 1-.343-.733c-.999.103-2.278.232-2.534.244c-.829.036-1.135.63-1.747.702c-.07.008-.194.024-.388.024c-.36 0-.963-.054-1.926-.31c-.772-.203-3.648-1.84-3.14-2.045c.26-.105 1.087-.176 2.175-.176c1.047 0 2.337.066 3.596.23c1.57.205 3.01.463 3.992.656q.024-.08.058-.154l-1.004-.48s-.8-.92-.715-.984l.012-.003c.126 0 .767.733.829.816l.605.202l-.284-.249s-.388-1.438-.287-1.472h.004c.106 0 .459 1.25.489 1.34c.07.06.303.152.596.32l-.308-.79s.14-1.305.243-1.305h.003c.105.021-.02 1.089-.047 1.221l.51.783a1.3 1.3 0 0 1 .463-.082c.184 0 .374.036.558.107c-.236-.502-.218-1.025.095-1.338a.84.84 0 0 1 .353-.209a.46.46 0 0 1 .457-.383c.127 0 .254.05.352.148a.5.5 0 0 1 .147.335c.151-.311.329-.73.317-.867c-.03-.307-.386-.852-.39-.857a.076.076 0 0 1 .064-.119c.025 0 .05.012.064.035c.016.023.381.582.414.927c.018.198-.21.696-.333.95a2.23 2.23 0 0 1 .873.874c.245-.12.715-.334.927-.334l.024.001c.345.033.904.399.927.414a.076.076 0 0 1-.084.128c-.005-.004-.55-.36-.857-.39h-.015c-.15 0-.552.171-.852.317c.12.004.242.053.335.147a.48.48 0 0 1 .012.681a.46.46 0 0 1-.247.128a.85.85 0 0 1-.21.354a.92.92 0 0 1-.67.255c-.212 0-.441-.055-.667-.16c.132.343.142.708.025 1.02l.783.51c.095-.019.666-.088.993-.088c.13 0 .222.011.228.04c.02.106-1.305.247-1.305.247l-.79-.308c.168.293.26.527.32.596c.091.03 1.374.392 1.34.493q-.007.018-.063.017c-.283 0-1.41-.304-1.41-.304l-.248-.284l.202.605c.087.065.876.755.813.841q-.006.007-.016.007c-.139 0-.967-.722-.967-.722l-.481-1.004a1 1 0 0 1-.154.058c.193.982.451 2.422.656 3.992c.335 2.569.26 5.261.054 5.77q-.024.06-.076.06M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12s-5.373 12-12 12m0-22.153C6.393 1.847 1.847 6.393 1.847 12S6.393 22.153 12 22.153S22.153 17.607 22.153 12S17.607 1.847 12 1.847"/></svg>
WASP Top 10 ( 2021 )
</h3>
|Posición|Nombre|
|:------:|:-----|
|__1__|Autenticación rota|
|__2__|Inyección|
|__3__|Entidades externas XML|
|__4__|Exposición de datos sensibles|
|__5__|Error de configuración de seguridad|
|__6__|Control de acceso roto|
|__7__|Desserialización insegura|
|__8__|Cross-Site Scripting ( XSS )|
|__9__|Logs/Monitoreo insuficiente|
|__10__|Uso de componentes con vulnerabilidades conocidas|
<a href="https://owasp.org/www-project-top-ten" style="display:block; text-align:center">https://owasp.org/www-project-top-ten</a>
---
<!-- .slide: style="text-align: left" -->
### __¿Qué es SAMM?__
<div>
<strong>SAMM</strong> significa: <span style="color: #fc3"><em>Software Assurance Maturity Model</em></span><br>
Modelo de Madurez de Aseguramiento de Software
</div>
<!-- .element: class="fragment" data-fragment-index="1" -->
Es un modelo de referencia abierto y estructurado para __gestionar la seguridad en el ciclo de vida del software__ ( SDLC ).
<!-- .element: class="fragment" data-fragment-index="2" -->
Desarrollado originalmente por la __fundación OWASP__ ( _Open Worldwide Application Security Project_ ).
<!-- .element: class="fragment" data-fragment-index="3" -->
Primera versión publicada en 2009, como evolución del proyecto OpenSAMM.
<!-- .element: class="fragment" data-fragment-index="4" -->
Última versión: <strong>SAMM v2.0 (2020)</strong>, totalmente actualizada para entornos modernos como DevSecOps, CI/CD y desarrollo ágil.
<!-- .element: class="fragment" data-fragment-index="5" -->
---
<!-- .slide: style="text-align: center" -->
<!-- .slide: data-transition="fade-in convex-out" -->
### __Pilares que Respeta SAMM__
<div style='color: #fff9c4'>La Tríada de Seguridad</div>
<!-- .element: class="fragment" data-fragment-index="1" -->
<img src="https://hackmd.io/_uploads/r1SdLOplxl.png" height="620">
<!-- .element: class="fragment fade-up" data-fragment-index="2" -->
---
<h2 class='h2'><svg xmlns="http://www.w3.org/2000/svg" width="70" height="65" viewBox="0 0 24 24"><path fill="#fff" d="M6 8c0-2.21 1.79-4 4-4s4 1.79 4 4s-1.79 4-4 4s-4-1.79-4-4m6 10.2c0-.96.5-1.86 1.2-2.46v-.24c0-.39.07-.76.18-1.12c-1.03-.24-2.17-.38-3.38-.38c-4.42 0-8 1.79-8 4v2h10zm10 .1v3.5c0 .6-.6 1.2-1.3 1.2h-5.5c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2v-1.5c0-1.4 1.4-2.5 2.8-2.5s2.8 1.1 2.8 2.5V17c.6 0 1.2.6 1.2 1.3m-2.5-2.8c0-.8-.7-1.3-1.5-1.3s-1.5.5-1.5 1.3V17h3z"/></svg> Confidencialidad</h2>
<div style='font-size: 31px; color: #ffa'><!-- .element: class="fragment" data-fragment-index="1" -->🎯 Garantizar que solo las personas autorizadas accedan a los datos.</div>
<div style='font-size: 45px' class='secondary my-3'>Ejemplos de Controles</div>
- <!-- .element: class="fragment" data-fragment-index="2" -->Cifrado de datos
- <!-- .element: class="fragment" data-fragment-index="3" -->Autenticación (usuarios/contraseñas, MFA)
- <!-- .element: class="fragment" data-fragment-index="4" -->Control de acceso basado en roles
---
<h2 class='h2'><svg xmlns="http://www.w3.org/2000/svg" width="70" height="60" viewBox="0 0 24 24"><path fill="#fff" d="M18.971 13.486a7.6 7.6 0 0 0-.54-1.043V6.415a6.38 6.38 0 0 0-1.88-4.535A6.37 6.37 0 0 0 12.017 0h-.002a6.37 6.37 0 0 0-4.536 1.878a6.38 6.38 0 0 0-1.88 4.537v.877h2.57v-.877c0-1.026.4-1.992 1.127-2.72a3.82 3.82 0 0 1 2.72-1.125a3.85 3.85 0 0 1 3.847 3.845v3.508A7.5 7.5 0 0 0 12 8.865a7.54 7.54 0 0 0-5.35 2.216a7.54 7.54 0 0 0-2.216 5.35a7.54 7.54 0 0 0 2.215 5.35A7.54 7.54 0 0 0 12 24a7.54 7.54 0 0 0 5.35-2.216a7.54 7.54 0 0 0 2.216-5.35c0-1.021-.2-2.012-.595-2.946zM12 21.428a5.003 5.003 0 0 1-4.997-4.996A5.003 5.003 0 0 1 12 11.435a5 5 0 0 1 4.997 4.997A5 5 0 0 1 12 21.428m2.145-4.973a2.12 2.12 0 1 1-4.24 0a2.12 2.12 0 0 1 4.24 0"/></svg> Disponibilidad</h2>
<div style='font-size: 31px; color: #ffa'><!-- .element: class="fragment" data-fragment-index="1" -->🎯 Evitar interrupciones que afecten la continuidad del negocio.</div>
<div style='font-size: 45px' class='secondary my-3'>Ejemplos de Controles</div>
- <!-- .element: class="fragment" data-fragment-index="2" --> Respaldos periódicos
- <!-- .element: class="fragment" data-fragment-index="3" --> Alta disponibilidad (redundancia)
- <!-- .element: class="fragment" data-fragment-index="4" --> Protección contra ataques DDoS y fallos del sistema.
---
<h2 class='h2'><svg xmlns="http://www.w3.org/2000/svg" width="70" height="60" viewBox="0 0 32 32"><path fill="#ffff" d="M21.346 24.019H7.306a1.2 1.2 0 0 1-1.249-1.15V4.915a1.2 1.2 0 0 1 1.249-1.15h14.04a1.2 1.2 0 0 1 1.254 1.15v17.954a1.2 1.2 0 0 1-1.254 1.15"/><path fill="#fff" d="M21.346 24.048H7.306a1.23 1.23 0 0 1-1.277-1.179V4.915a1.23 1.23 0 0 1 1.277-1.179h14.04a1.23 1.23 0 0 1 1.277 1.179v17.954a1.23 1.23 0 0 1-1.277 1.179M7.306 3.793a1.175 1.175 0 0 0-1.22 1.122v17.954a1.176 1.176 0 0 0 1.22 1.122h14.04a1.176 1.176 0 0 0 1.22-1.122V4.915a1.175 1.175 0 0 0-1.22-1.122Z"/><path fill="#a6a6a6" d="M23.566 22.2H9.54a1.2 1.2 0 0 1-1.248-1.145V3.173A1.2 1.2 0 0 1 9.54 2.028h14.026a1.2 1.2 0 0 1 1.249 1.145v17.88a1.2 1.2 0 0 1-1.249 1.147m-2.12-5.443a1.167 1.167 0 1 0 1.167 1.167a1.17 1.17 0 0 0-1.167-1.169Z"/><path fill="#464646" d="M23.566 22.226H9.54a1.23 1.23 0 0 1-1.276-1.173V3.173A1.23 1.23 0 0 1 9.54 2h14.026a1.23 1.23 0 0 1 1.277 1.173v17.88a1.12 1.12 0 0 1-.375.83a1.32 1.32 0 0 1-.902.343M9.54 2.057a1.174 1.174 0 0 0-1.22 1.116v17.88a1.173 1.173 0 0 0 1.22 1.116h14.026a1.27 1.27 0 0 0 .864-.327a1.06 1.06 0 0 0 .356-.789V3.173a1.173 1.173 0 0 0-1.22-1.116Zm11.906 17.06a1.2 1.2 0 1 1 1.195-1.2a1.2 1.2 0 0 1-1.195 1.2m0-2.333a1.138 1.138 0 1 0 1.138 1.138a1.14 1.14 0 0 0-1.138-1.138"/><path fill="#fff" d="M22.189 6.859H10.806V5.322h11.383Zm0 1.594H10.806v1.536h11.383Zm0 3.415H10.806V13.4h11.383Zm-5.122 3.415h-6.261v1.536h6.261Z"/><path fill="#464646" d="M17.1 16.848h-6.322v-1.594H17.1Zm-6.261-.057h6.2v-1.48h-6.2Zm11.383-3.358H10.778v-1.594h11.44Zm-11.383-.057h11.322V11.9H10.835Zm11.383-3.358H10.778V8.424h11.44Zm-11.387-.057h11.326v-1.48H10.835Zm11.383-3.073h-11.44V5.294h11.44Zm-11.383-.057h11.326v-1.48H10.835Z"/><path fill="#51768c" fill-rule="evenodd" d="M19.242 24.019a1.336 1.336 0 0 0-1.122 1.474v3.041A1.33 1.33 0 0 0 19.245 30h5.6a1.327 1.327 0 0 0 1.125-1.466l-.057-3.041c0-.808-.444-1.472-1.065-1.474V20.5a3.034 3.034 0 0 0-2.724-3.308a.6.6 0 0 0-.339.079a.71.71 0 0 0-.365.657a.665.665 0 0 0 .4.622a.6.6 0 0 0 .245.06c.819.015 1.532.974 1.518 2.794v2.614m-1.137 2.669v1.264a.256.256 0 0 1-.511 0v-1.263a.73.73 0 0 1-.51-.689a.767.767 0 0 1 1.532 0a.735.735 0 0 1-.51.689Z"/></svg> Integridad</h2>
<div style='font-size: 31px; color: #ffa'><!-- .element: class="fragment" data-fragment-index="1" -->🎯 Asegura que la información no sea modificada sin autorización.</div>
<div style='font-size: 45px' class='secondary my-3'>Ejemplos de Controles</div>
- <!-- .element: class="fragment" data-fragment-index="2" -->Hashes y sumas de verificación.
- <!-- .element: class="fragment" data-fragment-index="3" -->Firmas digitales
- <!-- .element: class="fragment" data-fragment-index="4" -->Control de versiones y registros de auditoría.
---
<img src="https://hackmd.io/_uploads/r1UmgXJZlg.png">
---
<img src="https://hackmd.io/_uploads/ryHSe7ybeg.png">
---
<!-- .slide: data-transition="fade-in convex-out" -->
<!-- .slide: data-background="linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.6)), url('https://miro.medium.com/v2/resize:fit:1400/1*OhMWhwIANjpNTIgu2XKRvA.jpeg') center/cover no-repeat" data-background-color="#000" -->
<h2 class='h2' style='font-size: 60px !important'>SDL <br>( <span style="color: #ffc">Security Development Lifecycle</span> )</h2>
---
<!-- .slide: data-transition="fade-in convex-in" -->
<!-- .slide: data-background="linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.6)), url('https://img.freepik.com/premium-photo/it-related-cyber-security-black-blue-colored-background_759575-16194.jpg') center/cover no-repeat" data-background-color="#000" -->
<h2 class='h2'>¿ Qué es SDL ?</h2>
El __Security Development Lifecycle__ es un proceso de desarrollo seguro creado por __Microsoft en 2004__, diseñado para integrar prácticas de seguridad en cada fase del ciclo de vida del software.
<!-- .element: class="fragment" data-fragment-index="1" -->
### __¿ Qué hace el SDL ?__
<!-- .element: class="fragment" data-fragment-index="2" -->
1. <!-- .element: class="fragment" data-fragment-index="3" --><strong>Define requisitos de seguridad</strong> desde el inicio.
2. <!-- .element: class="fragment" data-fragment-index="4" --><strong>Evalúa amenazas</strong> con modelos como <a href="https://es.wikipedia.org/wiki/STRIDE_(seguridad)">STRIDE</a>.
3. <!-- .element: class="fragment" data-fragment-index="5" --><strong>Integra pruebas de seguridad</strong> durante la codificación.
4. <!-- .element: class="fragment" data-fragment-index="6" --><strong>Automatiza revisiones</strong> de código y binarios.
5. <!-- .element: class="fragment" data-fragment-index="7" --><strong>Establece un plan de respuesta</strong> ante vulnerabilidades.
---
> Microsoft __aplicó SDL__ en productos como Windows 10, logrando una reducción significativa de fallos de seguridad y __adoptándolo como estándar interno en Azure__, __Office__ y otros servicios.
> Adobe implementó su propio SDL llamado "Adobe Secure Product Lifecycle" (SPLC). Está inspirado en el SDL de Microsoft e incluye revisiones de seguridad en cada fase del desarrollo de software, especialmente después de sufrir ataques como __el hackeo de Adobe Reader__.
---
<h2 class='h2'>Evaluación del Sistema</h2>
<h3>Gestión de Clientes y Usuarios</h3>
---
<!-- .slide: style="text-align: left" -->
## ⚠️Problemas Detectados
__Ausencia de control de acceso robusto__
- <!-- .element: class="fragment" data-fragment-index="2" -->Login sin cifrado.
- <!-- .element: class="fragment" data-fragment-index="3" -->Claves en texto plano.
__Falta de validación de entradas__
- <!-- .element: class="fragment" data-fragment-index="4" -->Inputs sin sanitización ni validaciones.
__Datos sensibles sin protección__
- <!-- .element: class="fragment" data-fragment-index="5" -->Correos, contraseñas, nombres y teléfonos almacenados sin seguridad.
__No hay control de errores o flujos maliciosos__
- <!-- .element: class="fragment" data-fragment-index="6" -->El programa no maneja errores de forma segura ni previene abusos.
---
### Análisis según SAMM y SDL
|Área|Observaciones|Riesgos|
|:---|:------------|:------|
|__Gobernanza__|No hay trazabilidad de usuarios ni logs de acciones.|Falta de auditoría y cumplimiento.|
|__Diseño__|No hay modelado de amenazas. Datos sensibles sin protección.|Exposición de datos, ataques de enumeración.|
|__Implementación__|No se usan funciones seguras ni separación de módulos. Todo se guarda en un solo script.|Fragilidad ante errores, bajo mantenimiento.|
|__Verificación__|No hay validaciones robustas ni pruebas automáticas.|Entrada maliciosa, fallos silenciosos.|
|__Operación__|No hay persistencia de datos ni gestión de sesiones.|Pérdida de datos, usuarios falsos, sin control de acceso efectivo.|
<!-- .element: class="fragment" data-fragment-index="2" -->
---
<!-- .slide: style="text-align: left" -->
## ✅ Recomendaciones
__Corto Plazo__
- <!-- .element: class="fragment" data-fragment-index="1" -->Validar inputs y controlar errores.
- <!-- .element: class="fragment" data-fragment-index="2" -->Sanitizar datos antes de procesarlos.
- <!-- .element: class="fragment" data-fragment-index="3" -->Cifrar contraseñas (hash con `bcript` o `hashlib`).
__Mediano Plazo__
- <!-- .element: class="fragment" data-fragment-index="4" -->Persistir datos en archivos o base de datos.
- <!-- .element: class="fragment" data-fragment-index="5" -->Modularizar el código (capas: lógica, datos, presentación).
- <!-- .element: class="fragment" data-fragment-index="6" -->Implementar roles de usuario y bitácora.
__Largo Plazo__
- <!-- .element: class="fragment" data-fragment-index="7" -->Aplicar SAMM para evaluar prácticas de desarrollo.
- <!-- .element: class="fragment" data-fragment-index="8" -->Incorporar SDL para formalizar procesos seguros.
- <!-- .element: class="fragment" data-fragment-index="9" -->Introducir pruebas automatizadas y revisiones de código.
---

---
<!-- .slide: data-transition="fade-in convex-out" -->
<h2 class='h2'>Evaluación Técnica</h2>
<h3>Gestión de Clientes y Usuarios</h3>
---
<!-- .slide: data-transition="fade-in convex-in" -->
<!-- .slide: style="text-align: left" -->
## __Falta de Persistencia de Datos__
En este programa, todos los datos están en __diccionarios en memoria__:
```python= [1|2]
clientes = {}
usuarios = {}
```
El sistema original almacena toda la información en estructuras en memoria (`dict`) que __se pierden al cerrar el programa__. Esto implica:
- Ausencia de persistencia de datos.
- Dificultad para auditar, validar o recuperar la información.
- Limitaciones para escalar o integrar con otros sistemas.
---
<!-- .slide: style="text-align: left" -->
## __Propuesta de Mejora__
<div class='mb-4' style='font-size: 31px; color: #ffa'><!-- .element: class="fragment" data-fragment-index="1" -->🎯 Fortalecer la persistencia, seguridad y estructura del sistema.</div>
- <!-- .element: class="fragment" data-fragment-index="2" -->Incorporar una <strong>base de datos como SQLite</strong> (ligera, integrada y no requiere servidor)
- <!-- .element: class="fragment" data-fragment-index="3" -->Diseño seguro y gestión de responsabilidades.
- <!-- .element: class="fragment" data-fragment-index="4" -->Definición clara del esquema de datos.
---
### __Código modular__
Primero definimos una función reutilizable que abre la base de datos:
```python! [2|3|5-9]
# db.py
import sqlite3
from sqlite3 import Connection
FILE = "schema.sql"
DB_PATH = "sistema.db"
def open_db() -> Connection:
return sqlite3.connect(DB_PATH)
```
---
## Buenas Prácticas
Y luego usamos esta función en `crear_esquema()` para ejecutar el archivo SQL:
```python [1|2|12|3-4|6-7]
def crear_esquema() -> bool:
try:
with open(FILE, 'r') as sql_file:
sql_script = sql_file.read()
with open_db() as con:
con.executescript(sql_script)
print("Base de datos creada exitosamente.")
return True
except (FileNotFoundError, IOError) as e:
print("Error al abrir o leer el archivo")
print(f"{FILE}: {e}")
return False
```
---
<!-- .slide: style='height: 100vh;' -->
Creamos un archivo de esquema SQL (`schema.sql`) con las tablas necesarias
<div style="display: flex; justify-content: space-between">
<div style="margin: 0 15px">
1\. Crear los clientes:
```sql!
CREATE TABLE clientes
(
id INTEGER AUTOINCREMENT,
run TEXT,
nombre TEXT,
apellido TEXT,
direccion TEXT,
fono TEXT,
correo TEXT,
tipo TEXT,
monto REAL,
deuda REAL,
PRIMARY KEY(id)
);
```
</div>
<div style="">
2\. Crear a los usuarios:
```sql
CREATE TABLE usuarios
(
id INTEGER AUTOINCREMENT,
username TEXT UNIQUE,
clave TEXT,
nombre TEXT,
apellidos TEXT,
correo TEXT,
PRIMARY KEY(id)
);
```
</div>
</div>
---
## __Manejo Inseguro de Información__
En este programa, las contraseñas se almacenan como texto plano.
```python=211 [1|5|6]
def ingresoUsuarios():
print("=======================================")
print(" INGRESO DE USUARIO ")
print("=======================================")
username = input( "INGRESE NOMBRE DE USUARIO: ")
clave = input( "INGRESE PASSWORD : ")
nombre = input( "INGRESE NOMBRE : ")
apellidos = input("INGRESE APELLIDOS : ")
```
<div class='alert alert-danger' style='font-size: 27px'>
<strong style='color: darkred !important'>Esto representa un riesgo grave</strong> si alguien accede a la memoria o si en el futuro se implementa persistencia sin cifrado
</div>
<!-- .element: class="fragment" data-fragment-index="4" -->
---
### __Mejora en el manejo Visual__
Instalar una librería:
<!-- .element: class="fragment highlight-green" -->
```bash
pip intall pwinput
```
Ejemplo de Uso:
```python=1 [1|4|6]
from pwinput import pwinput
...
def ingresoUsuarios():
...
clave = pwinput("INGRESE PASSWORD: ", mask="*")
...
```
---
<!-- .slide: data-background="url('https://hackmd.io/_uploads/B1fVNxJZgg.gif') center/contain no-repeat" data-background-color="#000"" -->
---
### __Mejora en el manejo Seguro__
```python
import hashlib
def ingresoUsuarios():
...
clave = pwinput("INGRESE PASSWORD: ", mask="*")
clave_hasheada = hashlib.sha256(clave.encode()).hexdigest()
...
```
---
## Conclusión
Este proyecto descuidó completamente la seguridad desde el inicio, lo que resultó en una aplicación vulnerable y riesgosa para los usuarios. Al no aplicar SDL ni SAMM, se comprometió la confidencialidad y confianza de los clientes. Este caso resalta la necesidad urgente de integrar prácticas de desarrollo seguro en cualquier tipo de proyecto, sin importar su tamaño o urgencia.
---
<!-- .slide: data-background="url('https://i.gifer.com/13Gx.gif') center/cover" -->
<h2 class='h2'>
FIN
</h2>
{"slideOptions":"{\"theme\":\"night\"}","title":"Introducción a la programación segura","description":"Charla de simulación de una consultora para desarrollo seguro","lang":"es-CL","contributors":"[{\"id\":\"8c3cebe9-e2a8-4ac5-b219-2e54412822a9\",\"add\":37951,\"del\":13336,\"latestUpdatedAt\":1759297257987}]","image":"https://hackmd.io/_uploads/ryRGgHcnex.png","dir":"ltr"}