我正在开发 Spring Boot REST 应用程序。我必须验证所有传入的请求。如果用户获得授权,则执行正常流程;如果没有,用户将获得带有自定义响应 JSON 的 401 HTTP 状态。
我正在使用 Servlet Filter 来做到这一点
public class SecurityFilter implements Filter {
@Autowired
ObjectMapper objectMapper;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String apikey = httpServletRequest.getHeader(“apikey”);
if(validApikey)
{
chain.doFilter(ServletRequest, servletResponse);
}
else {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setStatus(false);
errorResponse.setReason(“provided apikey on header is unauthorized”);
String errorMessage = objectMapper.writeValueAsString(errorResponse);
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
httpServletResponse.setContentType(“application/json”);
httpServletResponse.setStatus(401);
httpServletResponse.getWriter().write(responseJson);
httpServletResponse.getWriter().flush();
}
一切都按预期进行。但是当我尝试部署代码 Fortify 扫描时抱怨该行
httpServletResponse.getWriter().write(responseJson);
强化消息
SecurityFilter.java 通过在第 50 行调用 write() 来泄露系统数据或调试信息。 write() 泄露的信息可以帮助对手制定攻击计划。
当系统数据或调试信息通过套接字或网络连接将程序离开到远程计算机时,就会发生外部信息泄漏。外部泄漏可以帮助攻击者 通过泄露有关操作系统、完整路径名、用户名是否存在或配置文件位置的特定数据,比内部信息泄露更严重,这对于企业来说更困难 攻击者访问。
我可以在不使用 httpServletResponse.getWriter().write(responseJson); 的情况下获得自定义 JSON 响应吗?或者如何解决 Fortify 问题?
我设法通过使用 Jsoup 库清理请求和响应来解决该问题。
Maven 依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.1</version>
</dependency>
更改了以下行
请求
String apikey = httpServletRequest.getHeader(“apikey”);
到
String apikey = httpServletRequest.getHeader(“apikey”) == null ? null : Jsoup.clean(httpServletRequest.getHeader("apikey"), Safelist.none());
回复
httpServletResponse.getWriter().write(responseJson);
到
httpServletResponse.getWriter().write(Jsoup.clean(responseJson, Safelist.none());