【问题标题】:Spring Boot @ResponseBody Jackson - escape all String fieldsSpring Boot @ResponseBody Jackson - 转义所有字符串字段
【发布时间】:2019-09-07 22:59:45
【问题描述】:

有没有办法在 Spring Boot 中配置 Jackson,以便我可以 HTML 转义 @RequestBody 中的所有值?我尝试过使用序列化程序,但据我所知,它们被定义为特定的类。我需要一个过滤器来处理在 JSON 中发送的所有值,并使用以下内容对它们进行转义:

StringEscapeUtils.escapeHtml4(value)

谢谢

【问题讨论】:

  • 这看起来是个非常糟糕的主意。你为什么要这样做?如果有人发送一些文本,然后存储该文本。如果您在 HTML 页面中显示此文本,请在显示之前对其进行转义。如果它需要在不使用 HTML 的富客户端中以其他方式显示),请按原样显示:您真的不想取消转义。
  • @JBNizet 我没有任何 UI 使用我的 API,它都是机器对机器的。重点是防止 XSS 攻击。你将如何防止你的后端受到这些攻击?而且,即使这是一个我认为不是的坏主意,有人知道答案吗?
  • 如果文本从不显示在任何地方,你怎么可能受到 XSS 攻击?如果是,则在 html 页面中显示文本时对文本进行 html 转义。如果在 XML 文档中使用它,则 XML 转义它。如果它被用于丰富的应用程序等,请不要逃避它。
  • Man in the Middle 时可以注入 XSS。您不想将脚本存储在数据库中。实际上,大多数用于检测 API 漏洞的工具都会立即发现它。
  • OWASP 根本不这么认为。您链接到的文章说:本文将 HTML 页面视为模板,其中允许开发人员放置不受信任的数据 [...] 规则 #1 - 在将不受信任的数据插入 HTML 元素内容之前进行 HTML 转义。因此,它在将不受信任的数据显示在 HTML 模板中 之前对其进行转义。不是从用户那里收到文本时。

标签: java spring spring-boot jackson jackson-databind


【解决方案1】:

如何创建一个 XSS 过滤器并在 RequestInterceptor 中调用它

public class XSSRequestWrapper extends HttpServletRequestWrapper {

public XSSRequestWrapper(HttpServletRequest request) {
    super(request);
}

/**
 * Get XSS stripped parameter values
 * @param parameter parameter values string to be checked
 * @return xss striped encoded string
 */
@Override
public String[] getParameterValues(String parameter)
{
    String[] values = super.getParameterValues(parameter);
    if(values == null)
    {
        return new String[0];
    }
    int count = values.length;
    String[] encodedValues = new String[count];
    for(int i=0; i<count; i++)
    {
        encodedValues[i]= stripXSS(values[i]);
    }
    return encodedValues;
}

/**
 * Get XSS stripped parameter
 * @param parameter parameter string to be checked
 * @return xss striped encoded string
 */
@Override
public String getParameter(String parameter)
{
    String value = super.getParameter(parameter);
    return stripXSS(value);
}

/**
 * Get XSS stripped header
 * @param name header string to be checked
 * @return xss striped encoded string
 */
@Override
public String getHeader(String name)
{
    String value = super.getHeader(name);
    return stripXSS(value);
}

private String stripXSS(String value)
{
    return HtmlUtils.htmlEscape(value);
}
}

XSS 过滤器如下

 @WebFilter(urlPatterns = "/*")
 public class XSSFilter implements Filter {


/**
 * Filter initialization
 * @param filterConfig FilterConfig
*/
@Override
public void init(FilterConfig filterConfig) {
    // nothing required here
}

/**
 * Actual filter implementation
 * @param servletRequest ServletRequest
 * @param servletResponse ServletResponse
 * @param filterChain FilterChain
 * @throws IOException IOException
 * @throws ServletException ServletException
 */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    filterChain.doFilter(new XSSRequestWrapper((HttpServletRequest) servletRequest), servletResponse);
}

/**
 * Filter destroy
 */
@Override
public void destroy() {
    // nothing required here
}
}

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2020-01-09
    • 2015-11-16
    • 2021-04-13
    • 2013-07-29
    • 2021-03-09
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多