示例 4:深度验证
扫描示例 4 代码时,第一次扫描包含三个在对应跟踪例程中具有根的 AppScan® Source traces。假定在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 的此调用的输入 FileInputStream.read
在验证仅适合非常狭窄的上下文时,或在输入方法太宽泛而无法提供一个验证例程的情况下,创建特定于调用站点的验证例程。在 trace1
方法中应用于对 FileInputStream.read 的此调用时,trace1
不会在下次扫描后显示为结果,因为其调用堆栈包含对 validate
方法的调用。但是,仍会报告 trace2
,尽管它调用 validate
,因为验证例程的作用域与 trace1
调用站点相绑定。trace3
方法也调用 validate
,但是会继续报告该方法,因为它使用 ResultSet.getString
作为源。
特定于 API 的验证例程 - 针对 FileInputStream.read 的任何调用的输入 FileInputStream.read
验证仅适用于特定源时,创建特定于 API 的验证例程。应用于对 FileInputStream.read 方法的任何调用时,trace1
和 trace2
方法在下次扫描时都没有结果,因为它们包含对 validate
方法的调用。但是,trace3
方法继续存在,尽管它调用 validate
,因为它使用 ResultSet.getString
作为源。