spring Sping Boot -如何防止Fortify抱怨HttpServletResponse.getWriter.write(responseJson)是信息泄漏?

0pizxfdo  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(126)

我正在开发一个Sping Boot REST应用程序。我必须对所有传入的请求进行身份验证。如果用户被授权,则执行正常流程。如果没有,用户将获得401 HTTP状态和自定义响应JSON。
我正在使用Servlet过滤器进行此操作

  1. public class SecurityFilter implements Filter {
  2. @Autowired
  3. ObjectMapper objectMapper;
  4. @Override
  5. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
  6. throws IOException, ServletException {
  7. HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
  8. String apikey = httpServletRequest.getHeader(“apikey”);
  9. if(validApikey)
  10. {
  11. chain.doFilter(ServletRequest, servletResponse);
  12. }
  13. else {
  14. ErrorResponse errorResponse = new ErrorResponse();
  15. errorResponse.setStatus(false);
  16. errorResponse.setReason(“provided apikey on header is unauthorized”);
  17. String errorMessage = objectMapper.writeValueAsString(errorResponse);
  18. HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
  19. httpServletResponse.setContentType(“application/json”);
  20. httpServletResponse.setStatus(401);
  21. httpServletResponse.getWriter().write(responseJson);
  22. httpServletResponse.getWriter().flush();
  23. }

字符串
一切都按预期工作。但当我尝试部署代码Fortify扫描抱怨行

httpServletResponse.getWriter().write(responseJson);
加强消息

SecurityFilter.java通过在第50行调用write()来揭示系统数据或调试信息。write()揭示的信息可以帮助对手制定攻击计划。
当系统数据或调试信息通过套接字或网络连接离开程序到远程计算机时,就会发生外部信息泄漏。外部泄漏可以通过泄露有关操作系统、完整路径名、用户名存在或配置文件位置的特定数据来帮助攻击者,并且比内部信息泄漏更严重,后者更难被攻击者访问。
我可以在不使用httpServletResponse.getWriter().write(responseJson)的情况下获得自定义JSON响应吗?或者如何解决Fortify问题?

rsaldnfx

rsaldnfx1#

我设法通过使用Jsoup库清理请求和响应来解决这个问题。

Maven依赖

  1. <dependency>
  2. <groupId>org.jsoup</groupId>
  3. <artifactId>jsoup</artifactId>
  4. <version>1.17.1</version>
  5. </dependency>

字符串
更改了以下行

申请

  1. String apikey = httpServletRequest.getHeader(“apikey”);

to

  1. import org.jsoup.Jsoup;
  2. import org.jsoup.safety.Safelist;
  3. String apikey = httpServletRequest.getHeader(“apikey”) == null ? null : Jsoup.clean(httpServletRequest.getHeader("apikey"), Safelist.none());

回复

  1. httpServletResponse.getWriter().write(responseJson);

to

  1. httpServletResponse.getWriter().write(Jsoup.clean(responseJson, Safelist.none());

展开查看全部

相关问题