Checkmarks循环条件未校验输入问题:求第108行验证方案
Unchecked Input for Loop Condition问题的验证方案咨询
在Checkmarks中检测到如下异常:
com.ibm.vch.vch-\UpdateServiceImpl.java的update方法第108行通过IOUtils.toByteArray()获取用户输入,该输入未经过验证便在代码中流转,最终在\FieldUtils.java的updateCustomFieldMapping方法第154行被用于循环条件,构成Unchecked Input for Loop Condition问题。
相关代码片段(UpdateServiceImpl.java)
InputStream activityXML = new JaxbSerializer().marshal(resource.getActivity()); // line--- > 108 byte[] xmlData = IOUtils.toByteArray(activityXML); entity.setXmlData(xmlData);
用户问题
请问是否可以在第108行执行相关验证?提前感谢。
补充代码(FieldUtils.java)
private static String updateMapping(String str, Element cusFieldsElement) { Pattern p = Pattern.compile(IELD_PATTERN); Matcher m = p.matcher(xmlStr); while (m.find()) { String b = m.group(); String xPath = b.substring(2, b.length() - 1); if (xPath != null) { String id = xPath.substring(xPath.lastIndexOf(".") + 1); String name = fetchFieldNameFrId(id, cusFieldsElement); if (name != null) { String updatedId = "${" + CustomFieldUtils.constructCustomFieldID("/" + Constants.PARAMETERS + "/", name) + "}"; updatedId = StringEscapeUtils.escapeXml10(updatedId); xmlStr = xmlStr.replace(b, updatedId); } } } return xmlStr; }
解答
可以在第108行执行验证,具体可结合后续代码的处理逻辑设计以下验证规则:
- 限制输入大小:校验字节数组的长度,设置合理的上限(比如100KB),超过则直接抛出参数非法异常,避免过大的XML导致后续正则循环执行过多次数。
- 校验XML合法性:将字节数组转换为字符串后,用XML解析器(如DOM、SAX)验证结构是否合法,过滤畸形XML。
- 过滤危险模式:提前检查XML中是否包含可能让正则匹配陷入死循环的特殊内容,或者限制占位符的出现次数上限。
另外补充代码里的updateMapping方法还有几个需要优化的点:
- 参数
str和内部使用的xmlStr变量名不一致,属于低级错误,需修正。 - 循环中用
xmlStr.replace()会频繁创建新字符串,建议改用StringBuilder提升效率。 - 正则常量
IELD_PATTERN疑似拼写错误,应为FIELD_PATTERN,需确认定义是否正确。
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

