例 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
が検出結果として表示されなくなります。trace2
も validate
を呼び出していますが、検証ルーチンの有効範囲が trace1
呼び出しサイトに関連付けられているため、次回からのスキャンでも引き続き例外として報告されます。trace3
メソッドも validate
を呼び出していますが、ResultSet.getString
をソースとして使用しているため、次回からのスキャンでも引き続き例外として報告されます。
API 単位の検証ルーチン - 入力の呼び出し先: FileInputStream.read
特定のソースに対して検証のみが当てはまる場合は、API 単位の検証ルーチンを作成します。「FileInputStream.read に対するすべての呼び出しに適用」を指定した場合、trace1
メソッドと trace2
メソッドには validate
メソッドに対する呼び出しが記述されているため、次回からのスキャンではいずれのメソッドも検出結果として示されなくなります。ただし、trace3
メソッドは ResultSet.getString
をソースとして使用しているため、同じように validate
を呼び出しても、引き続き例外として報告されます。