===== Introducción a la programación segura ===== * Conjunto de técnicas que hacen el código de la aplicación más seguro y robusto * Muchas veces consiste en hacer un buen uso de las palabras reservadas que el lenguaje proporciona * Modificadores de accesibilidad, por ejemplo * Tener en cuenta aspectos de diseño a la hora de desarrollar una aplicación Más información en [[https://wiki.sei.cmu.edu/confluence/display/java/SEI+CERT+Oracle+Coding+Standard+for+Java|SEI CERT Oracle Coding Standar for Java]] y [[https://owasp.org/www-project-top-ten/|OWAS Top Ten Vulnerabilities]]
{{ owasp.png }} OWASP Top 10 Vulnerabilities
==== Control y validación del input de usuario ==== * Controlar siempre cualquier información que se introduzca en el programa por parte del usuario o cualquier entidad externa * Validar siempre los parámetros de entrada de cualquier método * Comprobar valores nulos, por ejemplo * Validar siempre la información antes de añadirla al log de la aplicación * Validar siempre la información antes de pasarla al método Runtime.exec() * Normalizar antes de validar cualquier String * ''Normalizer.normalize(cadena, Form.NFKC)'' ==== Encapsulación ==== * Hay que evitar que se pueda acceder a aquellos atributos a los que no sea necesario * Modificadores private, protected, public y por defecto * Comprobar si realmente es necesario que se pueda extender de una clase o método * Usar el modificar final al definir la clase o método * Evitar que algunos métodos puedan extenderse: ''clone'', ''toString'', . . . * Evitar exponer referencias a objetos mutables * Evitar el acceso a atributos o métodos que devuelve referencias a objetos mutables ==== Excepciones ==== * No ignorar ninguna checked Exception * ''printStackTrace'' es útil para depurar pero no para una aplicación en producción * Impedir que las excepciones expongan información sensible * No lanzar excepciones genéricas, como por ejemplo ''Exception'' * Lanzar siempre la excepción específica para cada caso * Nunca lanzar ''NullPointerException'' * Deberíamos corregir el código que genera ese error ==== Entrada/Salida ==== * Evitar serializar información sensible * private transient String informacionSensible; * Liberar los recursos después de su uso * Cerrar los recursos: método ''close()'' * Utilizar //try-with-resources// (AutoClosable) * Eliminar los ficheros temporales después de usarlos ==== Inyección de código ==== * Evitar la inyección de código SQL * Utilizar ''PreparedStatement'' en lugar de ''Statement'' * No construir las sentencias SQL concatenando variables ---- (c) {{date>%Y}} Santiago Faci