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 :
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).