如何解决Servlet的Coverity(类似于veracode的安全工具)中的“信任边界违规-安全问题?

问题描述 投票:1回答:1

扫描文件时出现以下安全问题。

“在通常被认为是可信任的上下文中使用受污染的数据“值”。由于可能无法验证或清除受信任的数据,因此可能会以不安全的方式错误地使用此数据。”

我尝试通过以下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);
java servlets esapi coverity veracode
1个回答
0
投票

这里有两条路径:

1。)输入验证,您在#2中的调用包含ESAPI验证。 (不确定您要抓住哪个验证器!)

2。)移交给另一层。在这种情况下,您将其设置为会话,该会话将保留在服务器上。成功解决此问题(以及类似的其他问题,例如SQL Injection或XSS)所需要使用的准则是跟踪数据路径,并在每次要处理该数据时问问自己,“这是否已通过?去翻译?“

每次答案为“是”时,您都会在该上下文中忽略该输入。在您的情况下,我还在代码中的其他地方使用此会话值?如果随后将其传递给SQL查询,则在执行直接数据库访问时,可以使用ORM实用程序或PreparedStatements。在前端,如果该值将回传给用户显示,那么您也需要在此处避开适当的上下文:如果您正在做单页Web应用程序,则需要对Javascript / JSON进行编码,或ajax,XML / HTML等。

简而言之,只要您跨越“信任界限”,就会要求您评估您的输入值是否已移交给解释器。如果是,则编码,如果否,则忽略。如果有帮助,请绘制应用程序中所有解释器的图,并确保您始终有一个应对之道。稍加练习,这便成为第二天性。

© www.soinside.com 2019 - 2024. All rights reserved.