java - 如何修复Servlet中Coverity(类似于veracode的安全工具)中的 "Trust boundary violation -Security Issue"?

标签 java servlets esapi coverity veracode

我在扫描文件时遇到以下安全问题。

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

我尝试通过以下 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(键, 值);

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 验证进行了覆盖。 (不确定您要获取哪个 validator !)

2.) 移交给另一层。在这种情况下,您将其设置到 session 中,该 session 将保留在服务器上。成功解决此问题(以及其他类似问题,例如 SQL 注入(inject)或 XSS)所需的规则是跟踪您的数据路径,并在每次处理该数据时问自己:“这是否会传递给解释器?”

每次答案是"is"时,您都会转义该上下文的输入。就您而言,我还在代码中的哪些地方使用此 session 值?如果您随后将其传递给 SQL 查询,则可以使用 ORM 实用程序或PreparedStatements(如果您正在进行直接数据库访问)。在前端,如果该值将被交还给用户显示,您也需要转义以获取适当的上下文:如果您正在开发单页 Web 应用程序,您将需要针对 Javascript/JSON 进行编码,或者如果它是 ajax、XML/HTML 等。

简而言之,每当您的“信任边界”被跨越时,您都会被要求评估您的输入值是否被传递给解释器。如果是,则编码,如果否,则忽略。如果有帮助的话,请绘制应用程序拥有的所有解释器的图表,并确保每次交接都有一个策略。经过一点练习,这就会成为第二天性。

关于java - 如何修复Servlet中Coverity(类似于veracode的安全工具)中的 "Trust boundary violation -Security Issue"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58092928/

相关文章:

java - 如何使用 Amazon SQS 和 SNS 发送多封电子邮件?

java - 使用 html 表单时 servlet 404 发现错误

java - 为什么 ESAPI 编码器不能与 Java 1.8 一起使用

java - 如何使用 ESAPI 修复 HTTP Response splitting 漏洞

java - 过滤器在 servlet 中不起作用

java - 如何更改 esapi 属性中的 header 长度

java - gscoord 和 gspage 或 gspop 不能在 MediaWiki 中一起使用

java - classloader和web应用以及war文件的lib目录

java - Apache Tomcat7 内存泄漏(怀疑是单例对象)

java - NullpointerException 与连接对象创建 SQL 语句