扫描文件时出现以下安全问题。
“在通常被认为是可信任的上下文中使用受污染的数据“值”。由于可能无法验证或清除受信任的数据,因此可能会以不安全的方式错误地使用此数据。”
我尝试通过以下3种方式修复,但是没有运气,因为重新扫描文件后,安全问题仍然在同一行中显示。
1) String value = request.getParameter(key);
if(value.matches("[0-9a-zA-Z_]+"){
if (key.startsWith("BOOKMARK"))
book.put(key, value);
else
session.setAttribute(key, value);
}
2) String value = request.getParameter(key);
ESAPI.validator().getValidInput("Value", value, "valuePattern", 100, false);
if (key.startsWith("BOOKMARK"))
book.put(key, value);
else
session.setAttribute(key, value);
}
3)String value = request.getParameter(key);
if (session.getAttribute(key) != null) {
if (key.startsWith("BOOKMARK"))
book.put(key, value);
else
session.setAttribute(key, value);
}
下面是代码段,此行中显示安全问题。
session.setAttribute(key,value);
private Bookmark cacheRequest(HttpServletRequest request) {
String key;
Bookmark book = new Bookmark();
HttpSession session = request.getSession();
Enumeration enumVar = request.getParameterNames();
System.out.println("after enumVar creation");
try {
while (enumVar.hasMoreElements()) {
key = (String) enumVar.nextElement();
String value = request.getParameter(key);
if (key.startsWith("BOOKMARK"))
book.put(key, value);
else
session.setAttribute(key, value); //flaw
}
} catch (java.lang.NegativeArraySizeException value) {
}
return book;
}
我预计此行中没有来自Http请求的“污染”值
session.setAttribute(key, value);
这里有两条路径:
1。)输入验证,您在#2中的调用包含ESAPI验证。 (不确定您要抓住哪个验证器!)
2。)移交给另一层。在这种情况下,您将其设置为会话,该会话将保留在服务器上。成功解决此问题(以及类似的其他问题,例如SQL Injection或XSS)所需要使用的准则是跟踪数据路径,并在每次要处理该数据时问问自己,“这是否已通过?去翻译?“
每次答案为“是”时,您都会在该上下文中忽略该输入。在您的情况下,我还在代码中的其他地方使用此会话值?如果随后将其传递给SQL查询,则在执行直接数据库访问时,可以使用ORM实用程序或PreparedStatements。在前端,如果该值将回传给用户显示,那么您也需要在此处避开适当的上下文:如果您正在做单页Web应用程序,则需要对Javascript / JSON进行编码,或ajax,XML / HTML等。
简而言之,只要您跨越“信任界限”,就会要求您评估您的输入值是否已移交给解释器。如果是,则编码,如果否,则忽略。如果有帮助,请绘制应用程序中所有解释器的图,并确保您始终有一个应对之道。稍加练习,这便成为第二天性。