Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + tecnología especializada

Determinar Tipo Archivo Usando Su Extensión

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al determinar el tipo de archivo verificando su extensión. La validación de entradas es fundamental para desarrollar aplicaciones robustas y seguras.

Necesidad

Determinar tipo de archivo usando su extensión desde Java.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación con Java.

  2. Se necesita validar la entrada de datos, específicamente validar el tipo de archivo a ser manipulado.

  3. Se confía en que la extensión es suficiente para determinar el tipo de archivo.

Solución

Las entradas representan una forma de comunicación entre la aplicación y el usuario. Al momento de programar aplicaciones computacionalmente seguras debemos suponer que el usuario final puede ser un usuario malicioso, por lo cual es necesario tomar medidas de seguridad para evitar que nuestra aplicación sea vulnerada, a través de prácticas de programación segura. Aquí es donde la validación de entradas juega un papel fundamental a la hora de fortalecer la seguridad de nuestra aplicación. En este artículo nos enfocaremos en realizar una validación de archivos basándonos en su extensión. Para ello debemos seguir los siguientes pasos:

  1. Inicialmente creamos un archivo a utilizar en las pruebas que denominaremos test.pdf, cuyo único contenido sera la palabra fsg:

    Creando el archivo de prueba
    1
    2
    % cat test.pdf
    fsg
    
  2. Creamos el archivo FileUtils.java que contendrá el código de la aplicación.

  3. Importamos la interfáz java.net.FileNameMap, que representa una tabla de equivalencias entre extensión y tipo de archivo.

    FileValidate.java
    1
    2
    3
    % cat FileUtils.java
    import java.net.FileNameMap;
    ...
    
  4. Importamos la clase abstracta java.net.URLConnection, la cual representa enlaces de comunicación entre una aplicación y una URL.

    1
    2
    import java.net.URLConnection;
    ...
    
  5. Usando el método getFileNameMap, obtenemos una instancia que cumple la interfaz FileNameMap, la cual denominaremos fileNameMap.

    1
    2
    3
    4
    public class FileUtils {
      public static void main(String args[]) {
      FileNameMap fileNameMap = URLConnection.getFileNameMap();
    ...
    
  6. Solicitamos a la nueva instancia que consulte el tipo de archivo para nuestro archivo de prueba test.pdf y lo mostramos por la salida estándar.

    1
    2
    3
    4
        String type = fileNameMap.getContentTypeFor("file://test.pdf");
        System.out.println(type);
      }
    }
    
  7. El método getContentTypeFor que busca la equivalencia entre extensión y tipo de archivo en [jre_home]/lib/content-types.properties, excepto si se ha definido el archivo content.types.user.table, lo cual generalmente no es necesario.

  8. Finalmente compilamos la clase y la ejecutamos para observar los resultados:

    1
    2
    3
    % javac FileUtils.java
    % java FileUtils
    application/pdf
    
  9. Se observa que este mecanismo clasificó nuestro archivo de prueba como pdf, aún cuando sabemos que el contenido no lo es. Notar también que no se requiere manejo de excepciones. Si el archivo no existe la aplicación simplemente mostrará null.




Haz un comentario

Estado de los servicios - Términos de Uso