<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. --- ![image](https://hackmd.io/_uploads/rku3na0gxl.png) --- <!-- .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"}
    437 views