範例 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 行註解)。