Java Checkmarx-如何验证和清理HttpServletRequest.getInputStream以通过Checkmarx扫描

Java Checkmarx-如何验证和清理HttpServletRequest.getInputStream以通过Checkmarx扫描,java,spring-boot,security,sonarqube,checkmarx,Java,Spring Boot,Security,Sonarqube,Checkmarx,以下是问题的细节 无限制文件上传 源对象:请求(第39行) 目标对象:getInputStream(行号-41) 请求对象在checkmarx工具中高亮显示- 如何正确验证、筛选、转义和/或编码用户可控制的输入,以通过Checkmarx扫描?似乎扫描程序在您的代码中发现了XSS漏洞 从OWASP的: 跨站点脚本(XSS)攻击是一种注入类型,其中 恶意脚本被注入到其他良性且可信的系统中 网站。当攻击者使用web应用程序攻击时,就会发生XSS攻击 发送恶意代码,通常以浏览器端脚本的形式, 给不同的最

以下是问题的细节 无限制文件上传

源对象:请求(第39行)

目标对象:getInputStream(行号-41)

请求对象在checkmarx工具中高亮显示-


如何正确验证、筛选、转义和/或编码用户可控制的输入,以通过Checkmarx扫描?

似乎扫描程序在您的代码中发现了XSS漏洞

从OWASP的:

跨站点脚本(XSS)攻击是一种注入类型,其中 恶意脚本被注入到其他良性且可信的系统中 网站。当攻击者使用web应用程序攻击时,就会发生XSS攻击 发送恶意代码,通常以浏览器端脚本的形式, 给不同的最终用户。允许这些攻击成功的缺陷包括 非常广泛,并且发生在web应用程序使用来自的输入的任何地方 未经验证或编码而生成的输出中的用户 它

要深入了解如何避免跨站点脚本漏洞,强烈建议查看OWASP。 这里列出了一些消毒剂选项,您可以根据特定语言和相关用途进行选择


祝你好运。

有时,我们可以通过某种程度的间接操作来欺骗工具。你能试试下面的方法看看能不能解决你的问题

替换:

authorights creds=new ObjectMapper().readValue(req.getInputStream(),authorights.class);
有,

authorights creds=new ObjectMapper().readValue(req.getReader().lines().collect(collector.joining(System.lineSeparator())),authorights.class);

这对我很有效-检查并传递此高漏洞

我使用了@reflexans和@tgdavies comment的组合

@Override
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
        throws IOException
{
    int len = req.getContentLength();
    len = Integer.parseInt(Encode.forHtml(String.valueOf(len)));
    String type = req.getContentType();
    type =  Encode.forHtml(type);
    Entitlements creds;
    if(len == INPUT_LENGTH && type.equals(MIMETYPE_TEXT_PLAIN_UTF_8)) {
        creds = new ObjectMapper().readValue(req.getReader().lines().collect(Collectors.joining(System.lineSeparator())), Entitlements.class);
    }else{
        creds = new Entitlements();
    }

    return getAuthenticationManager().authenticate(
            new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
}

您可以将代码重构为如下所示:

// Negative
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {

    public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
            throws AuthenticationException, IOException, ServletException {

        if (req.getContentLength() > MAX_REQUEST_SIZE) {
            throw new IOException("request body size too big!");
        }

        Entitlements creds = new ObjectMapper().readValue(req.getInputStream(), Entitlements.class);

        return getAuthenticationManager()
                .authenticate(new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
    }

}
您可以使用
getContentLength
作为验证器。默认情况下,CxSAST 9.3无法检测此验证器。您可以通过此文件中的内容覆盖Java_低可见性/无限制文件上传查询:


还支持其他验证器,
getSize
getFileSize
。您还可以将
MultipartConfig
注释与
maxRequestSize
一起使用。或者在web.xml中使用
multipart config
max request size

您的问题有点宽泛,但我假设您具体指的是请求对象。验证、筛选或转义的内容取决于您正在使用和处理的HttpServletRequest的哪个属性。介意再分享一些代码吗?@RomanCanlas添加了更多代码片段供参考。关于代码的上下文,我认为这是一个误判。这里的明显来源是request.getHeader(“Authorization”),其中Checkmarx怀疑是恶意输入的入口点,但该令牌似乎不会呈现在会导致XSSY的页面上。在使用输入流之前,您可以尝试检查内容类型header是否为application/json,但是如果没有更多关于Checkmarx查找内容的信息,就很难说了。if(req.getHeader(“Content Type”)==null | | |!req.getHeader(“Content Type”).startsWith(“application/json”)}{//返回400个结果}但是你确实需要弄清楚Checkmarx期望的是什么。让我试试你的解决方案。仅供参考-Checkmarx检查函数输入参数的整个流程。在你的解决方案中,验证/编码/过滤未使用。请解释一下,间接性将如何欺骗工具大多数代码扫描工具依赖于标准patterns并基于已知模式检测错误。在您的情况下,将原始输入流发送到方法是一个确定的红色标志。期望您在开始解析数据之前解析输入。这些间接模式将是非标准模式,因此允许您通过测试。我们仅在确定它是假阳性时才使用它。是否为fix问题?尚未应用您的代码更改。正在等待我的早期代码更改报告。FYI-String inputStreamStr=IOUtils.toString(req.getInputStream(),StandardCharsets.UTF_8.name());inputStreamStr=SecurityUtil.sanitizeObject(inputStreamStr,String.class);InputStream InputStream=new ByteArrayInputStream(inputStreamStr.getBytes());授权creds=new ObjectMapper().readValue(inputStream,授权.class);
// Negative
public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter {

    public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res)
            throws AuthenticationException, IOException, ServletException {

        if (req.getContentLength() > MAX_REQUEST_SIZE) {
            throw new IOException("request body size too big!");
        }

        Entitlements creds = new ObjectMapper().readValue(req.getInputStream(), Entitlements.class);

        return getAuthenticationManager()
                .authenticate(new UsernamePasswordAuthenticationToken(creds.getId(), "", Collections.emptyList()));
    }

}