我在代码的下面几行得到了循环条件的未检查输入。
String FirstName= request.getParameter("FirstName") !=null ?request.getParameter("FirstName"):"";
我提供了以下解决方案,但checkmarx扫描仍然显示相同的错误。
if(!FirstName.equals("")){
FirstName=ESAPI.validator().getValidInput("requestParameter",FirstName,"HTTPParameterValue", 2000, true);
}
我也使用了getValidinteger((方法,但两者似乎都没有解决问题。
这是环路——
ArrayList<String> userDetails = UserData.getDetails(FirstName);
for(int i=0;i<=userDetails.size();i++){
String rollno=userDetails.get(0)!=null?userDetails.get(0):"";
String subject=userDetails.get(1)!=null?userDetails.get(1):"";
}
虽然userDetails.size似乎不是恶意用户可以控制或影响的东西(看到UserData.getDetails只会提供一组修复项目(,但验证userDetails.size是否存在大小可能无意中增加到很大数字的任何潜在风险仍然是一个好主意,导致拒绝服务。
因此,与其验证Firstname,不如验证检查的Arraylist的大小
static final int MAXSIZE = 2000;
int arraySize = userDetails.size();
if (arraySize > MAXSIZE) { // todo }
for(int i=0;arraySize;i<=i++){
String rollno=userDetails.get(0)!=null?userDetails.get(0):"";
String subject=userDetails.get(1)!=null?userDetails.get(1):"";
}
使用迭代器在数组中循环,而不是在for循环中使用arraySize。这将解决问题。