例 4: 詳細な検証

例 4 のコードを調べると、最初のスキャンには、対応するトレース・ルーチンをルートとする 3 つの AppScan® ソース・トレースが記述されていることがわかります。この例では、trace1 での FileInputStream.read メソッドの選択と validate ルーチンの追加が仮定されています。サンプル・ソース・コードに続くセクションでは、検証ルーチンの有効範囲ごとの影響について説明しています。

public class TestCase_IOT_UserValidation {
    ResultSet resultSet;
    FileInputStream fileInputStream;
    PrintWriter printWriter;
    byte[] buffer;

    public static void main(String[] args) throws Exception {
        TestCase_IOT_UserValidation testCase = new TestCase_IOT_UserValidation();
        testCase.trace1();

        TestCase_IOT_UserValidation testCase2 = new TestCase_IOT_UserValidation();
        testCase2.trace2();

        TestCase_IOT_UserValidation testCase3 = new TestCase_IOT_UserValidation();
        testCase3.trace3();
    }

    private void trace1() throws Exception {
        String source = getVulnerableSource1();
        source = validate(source);
        writeToVulnerableSink(source);
    }

    private void trace2() throws Exception {
        String source = getVulnerableSource2();
        source = validate(source);
        writeToVulnerableSink(source);
    }

    private void trace3() throws Exception {
        String source = getVulnerableSource3();
        source = validate(source);
        writeToVulnerableSink(source);
    }

    public String getVulnerableSource1() throws Exception {
        fileInputStream.read(buffer);
        return new String(buffer);
    }

    public String getVulnerableSource2() throws Exception {
        fileInputStream.read(buffer);
        return new String(buffer);
    }

    public String getVulnerableSource3() throws Exception {
        return resultSet.getString("x");
    }

    public void writeToVulnerableSink(String str) throws Exception {
        printWriter.write(str);
    }

    private String validate(String source) throws Exception {
        // validate
        return source;
    }
}

呼び出しサイト単位の検証ルーチン - 入力の呼び出し先: FileInputStream.read

非常に狭いコンテキストでのみ検証が当てはまる場合や、入力メソッドが広範すぎて 1 つの検証ルーチンに絞り込めない場合は、呼び出しサイト単位の検証ルーチンを作成します。trace1 メソッドで「FileInputStream.read に対するこの呼び出しに適用」を指定した場合、呼び出しスタックに validate メソッドに対する呼び出しが含まれているため、次回のスキャンからは trace1 が検出結果として表示されなくなります。trace2validate を呼び出していますが、検証ルーチンの有効範囲が trace1 呼び出しサイトに関連付けられているため、次回からのスキャンでも引き続き例外として報告されます。trace3 メソッドも validate を呼び出していますが、ResultSet.getString をソースとして使用しているため、次回からのスキャンでも引き続き例外として報告されます。

API 単位の検証ルーチン - 入力の呼び出し先: FileInputStream.read

特定のソースに対して検証のみが当てはまる場合は、API 単位の検証ルーチンを作成します。「FileInputStream.read に対するすべての呼び出しに適用」を指定した場合、trace1 メソッドと trace2 メソッドには validate メソッドに対する呼び出しが記述されているため、次回からのスキャンではいずれのメソッドも検出結果として示されなくなります。ただし、trace3 メソッドは ResultSet.getString をソースとして使用しているため、同じように validate を呼び出しても、引き続き例外として報告されます。