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

How to solve this XSS security issue in JSP page

我们有一个非常旧的网络服务器,其中有一些 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;
    }
}

谢谢,

根据你的情况,你的后台做了严格的输入限制,不能XSS。此警告是误报,请忽略。

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

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

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

所以你会有这样的代码:

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

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