Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Concatenar Cadenas de Caracteres

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al concatenar las cadenas de caracteres. Las concatenaciones recursivas e iterativas requieren de un gran carga computacional por lo cual deben realizarse de forma eficiente.

Necesidad

Concatenar cadenas de caracteres sin afectar el rendimiento en Java.

Contexto

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

  1. Se sabe cuando usar la clase StringBuilder frente a StringBuffer.

  2. Se está desarrollando en Java 1.5 o superior. Si se está desarrollando en Java 1.0 - 1.4, se debe utilizar StringBuffer en vez de StringBuilder.

  3. Se busca una comparación aproximada.

  4. La concatenación se hace de forma iterativa o recursiva.

Solución

Java dispone de dos tipos de clases para representar las cadenas de caracteres:

  • Cadenas mutables: Una vez instanciada una cadena su valor puede cambiar.

  • Cadenas inmutables: Una vez instanciada una cadena su valor no puede cambiar.

Teniendo en consideración lo anterior, es ideal utilizar cadenas inmutables cuando se sabe que no se realizarán modificaciones como concatenaciones, reducciónes, entre otras operaciones, sobre las cadenas. Por su parte, el uso de las cadenas mutables son para todo lo contrario es decir, las cadenas serán concatenadas, reducidas, entre otras modificaciones que se pueden hacer sobre las mismas.

El uso de estos lineamientos evita la creación de objetos innecesarios cuando se realizan operaciones entre cadenas inmutables [1].

Concatenar cadenas de caracteres mediante el operador \+ es adecuado para unir pocos Strings, teniendo en cuenta que la JVM cuenta con optimizadores que pueden hacer uso, por ejemplo, de StringBuilder.

Para un gran número de iteraciones, se recomienda hacer uso del método append de las clases StringBuilder (no sincronizada) o StringBuffer (sincronizada). De este modo solo es necesario la creación de una sola instancia [2].

El siguiente código busca ejemplificar el uso de StringBuilder y medir su rendimiento:

  1. Se empieza por definir los objetos que serán usados más adelante.

    main.java
    1
    2
    3
    4
    5
    class Main {
      public static void main(String args []) {
        long startTime = System.currentTimeMillis ();
        String strPrueba="Fluid Attacks";
        String tmpString = new String ();
    
  2. Se crea una instancia de la clase java.lang.StringBuilder [3].

    1
    StringBuilder strBuilder = new StringBuilder();
    
  3. Para agregar múltiples objetos String se debe crear operaciones atómicas donde se ingrese cada objeto String por separado. Vemos como en el ciclo siguiente se agrega el String consecutivamente.

    1
    2
    3
    4
    int numIteraciones=5000;
    for (int i=0; i < numIteraciones ;i++){
      strBuilder.append (strPrueba);
    }
    
  4. Finalmente, para convertir objetos StringBuilder a String se usa el método toString.

    1
    tmpString = strBuilder.toString();
    
  5. Se calcula el tiempo de ejecución para comparar con la aplicación que no usa StringBuilder.

    1
    2
    3
    4
      long endTime = System.currentTimeMillis () - startTime;
      System.out.println(endTime);
      }
    }
    
  6. Se observa la diferencia en milisegundos de 4 frente a 484, corriendo la aplicación en un procesador Core i5 de 2.40GHz con 4GB de memoria RAM.

    1
    2
    3
    4
    5
    6
    % javac Main.java
    % java Main
    4
    % javac MainUsandoMas.java
    % java MainUsandoMas
    484
    



Haz un comentario

Estado de los servicios - Términos de Uso