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



我们有一个非常旧的web服务器,其中一些JSP页面如下所示。我想我已经检查了输入参数"version"与白名单"[a- za - z0 -9]*"。但是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;
}
}

谢谢,

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

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

如果您使用ESAPI编码器之类的东西,它会接受您潜在的易受攻击的输入,将其更改为经过处理的表单,然后返回经过处理的表单。这将把ESAPI编码器放入数据流中,并且应该导致结果被删除。Checkmarx SAST在数据流路径上查找杀毒程序,如果找到杀毒程序,则不会将数据流路径报告为易受攻击。

你会有这样的代码:

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

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

根据您的情况,您的后端做了严格的输入限制,所以它不能是XSS。此警告为误报,请忽略。

相关内容

  • 没有找到相关文章

最新更新