===== 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]]

<figure>
{{ owasp.png }}
<caption>OWASP Top 10 Vulnerabilities</caption></figure>

==== 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