首页 > 解决方案 > 如何解决 JSP 页面中的这个 XSS 安全问题

问题描述

我们有一个非常古老的 Web 服务器,其中包含一些 JSP 页面,如下所示。我想我已经用白名单“[a-zA-Z0-9]*”检查了输入参数“version”。但是 CheckMarx 仍然收到 XSS 附加警告:“这些不受信任的数据直接嵌入到输出中,没有经过适当的清理或编码,使攻击者能够将恶意代码注入到输出中。”。您知道如何在 JSP 页面中正确执行此操作吗?它只是用于显示参数输入中的某些内容。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.mytest.util.SecurityService"%>
<html>
<%
    String version = SecurityService.getSafeContent(request.getParameter("version"));
%>

<head>
<title>My Project</title>
</head>
<body>
    <div style="text-align: center">
        <table>
            <tr>
                <td>
                    <div style="text-align: center"><%=version%></div>
                </td>
            </tr>
        </table>
    </div>
</body>
</html>
public class SecurityService{
    public static final String PARAM_INVALID_DATA_POINT = "";
    
    public static String getSafeContent(String content) {
        if(!StringUtils.isEmpty(content) && content.matches("[a-zA-Z0-9]*")) {
            return content;
        }
        return PARAM_INVALID_DATA_POINT;
    }
}

谢谢,

标签: javasecurityjspxsscheckmarx

解决方案


这是因为您正在进行验证而不是清理。验证是用于检查易受攻击数据的控制流类型的方法(如果无效则...否则...)。Checkmarx SAST 进行数据流分析,但不进行控制流分析。

虽然今天您可以将其标记为误报,但有人可能会进来并重构代码,并且可能会无意中更改您的验证正则表达式。由于它被标记为误报,因此可能不会捕获损坏的验证。这是一个简单的正则表达式,但想想如果它是一个更复杂的正则表达式以及其他验证逻辑会发生什么。

如果您使用ESAPI 编码器之类的东西,它会获取您可能存在漏洞的输入,将其更改为经过处理的形式,然后返回经过处理的形式。这会将 ESAPI 编码器放入数据流中,并应导致结果被删除。Checkmarx SAST 在数据流路径上查找清理程序,如果找到清理程序,则不会将数据流路径报告为易受攻击。

所以你会有这样的代码:

<%
    String version = ESAPI.encoder().encodeForHTML(request.getParameter("version"));
%>

还有其他编码器选项,您只需确保它们在您的 Checkmarx SAST 版本中被识别。


推荐阅读