Exemple 1 : d'une source au collecteur

Dans l'exemple de code suivant, la méthode principale appelle une méthode, getVulnerableSource, qui renvoie une chaîne. Notez que bien que la méthode lise des données depuis un fichier complètement inconnu, elle ne vérifie jamais la validité des données renvoyées. La méthode principale transmet alors ces données entachées dans writeToVulnerableSink. La méthode writeToVulnerableSink écrit les données dans le fichier, sans jamais vérifier leur validité.

import java.io.*;

public class TestCase_IOT_Static {
  public static void main(String[] args) {
    try {
      writeToVulnerableSink(getVulnerableSource(args[0]));
    } catch (Exception e) {
    }
  }

  public static String getVulnerableSource(String file)
    throws java.io.IOException, java.io.FileNotFoundException {
    FileInputStream fis = new FileInputStream(file);
    byte[] buf = new byte[100];
    fis.read(buf);
    String ret = new String(buf);
    fis.close();
    return ret;
  }

  public static void writeToVulnerableSink(String str)
    throws java.io.FileNotFoundException {
    FileOutputStream fos = new FileOutputStream(str);
    PrintWriter writer = new PrintWriter(fos);
    writer.write(str);
  }
}

L'exemple de code génère la trace suivante :


Vue Trace

Le panneau présente la pile d'entrée dans laquelle main appelle getVulnerableSource qui appelle FileInputStream.read - et la pile de sortie dans laquelle main appelle writeToVulnerableSink qui appelle PrintWriter.write. Le graphique décrit le flux de données depuis la méthode de lecture vers la méthode d'écriture avec la méthode main joignant les deux piles d'appels. La section Flux de données indique les numéros de ligne des opérations de la méthode main qui transmettent la tache. Dans cet exemple, les deux appels de méthode existent sur la même ligne (ligne 15) dans la méthode (dans l'exemple de code ci-dessus, cela est transmis au numéro de ligne 7 - dans la capture d'écran, le fichier inclut 8 lignes de commentaires).