範例 1:從來源到接收槽

在下列程式碼範例中,main 方法呼叫會傳回字串的 getVulnerableSource 方法。請注意,雖然這個方法會從完全不明的檔案讀取資料,但從不檢查傳回之資料的有效性。之後,main 方法又將這個受污染資料傳給 writeToVulnerableSinkwriteToVulnerableSink 方法將資料寫到檔案中,從不檢查其有效性。

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