範例 1:從來源到接收槽
在下列程式碼範例中,main 方法呼叫會傳回字串的 getVulnerableSource 方法。請注意,雖然這個方法會從完全不明的檔案讀取資料,但從不檢查傳回之資料的有效性。之後,main 方法又將這個受污染資料傳給 writeToVulnerableSink。writeToVulnerableSink 方法將資料寫到檔案中,從不檢查其有效性。
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);
}
}程式碼範例會產生下列追蹤:
窗格顯示輸入堆疊,其中 main 呼叫 getVulnerableSource,後者又呼叫 FileInputStream.read,也顯示輸出堆疊,其中 main 呼叫 writeToVulnerableSink,後者又呼叫 PrintWriter.write。圖形顯示資料如何從 read 方法流到 write 方法,由 main 結合這兩個呼叫堆疊。「資料流」區段顯示 main 方法中,傳遞污染之作業中的行號。在此範例中,兩種方法呼叫都存在於方法內的同一行(第 15 行)。(在上述的範例程式碼中,這會轉換至第 7 行;在畫面擷取中,檔案包含 8 行註解。)