当前位置: 首页 > 面试题库 >

Spring 3.2.4中带有@RequestBody的@InitBinder转义XSS

狄飞尘
2023-03-14
问题内容

@RequestBody我的方法中有一个带注释的参数,如下所示:

@RequestMapping(value = "/courses/{courseId}/{name}/comment", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody CommentContainer addComment(@PathVariable Long courseId,
                          @ActiveAccount Account currentUser,
                          @Valid @RequestBody AddCommentForm form,
                          BindingResult formBinding,
                          HttpServletRequest request) throws RequestValidationException {

.....
}

然后@InitBinder在同一个控制器中有一个带注释的方法:

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.registerCustomEditor(AddCommentForm.class, new StringEscapeEditor());
}

StringEscapeEditor没有跑步。但是我的initBinder方法是。因此,它不会将我的表单映射到转义编辑器。读完此线程后,这似乎是正确的(似乎@RequestMapping不受的支持@InitBinder

测试了映射@PathVariable字符串,然后我的编辑器正在工作。

这在我的应用程序中很重要,因为我的大多数绑定都是用@RequestBody它完成的,如果我可以对它应用一些自定义绑定,那就太好了。

解决此问题的最常用方法是什么?并转义我的输入数据以进行脚本攻击。


问题答案:

为了逃避XSS,我建议在输出数据时进行转义,因为正确的转义取决于输出文档。

如果@ResponseBody客户端直接使用所产生的JSON响应,并且没有机会让XSS转义内容,那么可以自定义JacksonMessageConverter以对字符串执行XSS转义。

可以像这样自定义JacksonMessageConverter:

1)首先,我们创建ObjectMapper工厂,该工厂将创建我们的自定义对象映射器:

public class HtmlEscapingObjectMapperFactory implements FactoryBean<ObjectMapper> {

    private final ObjectMapper objectMapper;

    public HtmlEscapingObjectMapperFactory() {
        objectMapper = new ObjectMapper();
        objectMapper.getJsonFactory().setCharacterEscapes(new HTMLCharacterEscapes());
    }

    @Override
    public ObjectMapper getObject() throws Exception {
        return objectMapper;
    }

    @Override
    public Class<?> getObjectType() {
        return ObjectMapper.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    public static class HTMLCharacterEscapes extends CharacterEscapes {

        private final int[] asciiEscapes;

        public HTMLCharacterEscapes() {
            // start with set of characters known to require escaping (double-quote, backslash etc)
            asciiEscapes = CharacterEscapes.standardAsciiEscapesForJSON();
            // and force escaping of a few others:
            asciiEscapes['<'] = CharacterEscapes.ESCAPE_CUSTOM;
            asciiEscapes['>'] = CharacterEscapes.ESCAPE_CUSTOM;
            asciiEscapes['&'] = CharacterEscapes.ESCAPE_CUSTOM;
            asciiEscapes['"'] = CharacterEscapes.ESCAPE_CUSTOM;
            asciiEscapes['\''] = CharacterEscapes.ESCAPE_CUSTOM;
        }


        @Override
        public int[] getEscapeCodesForAscii() {
            return asciiEscapes;
        }

        // and this for others; we don't need anything special here
        @Override
        public SerializableString getEscapeSequence(int ch) {
            return new SerializedString(StringEscapeUtils.escapeHtml4(Character.toString((char) ch)));

        }
    }
}

(HtmlCharacterEscapes的灵感来自于这个问题:Spring MVC和Jackson
Mapper的HTML转义

2)然后,我们注册使用自定义对象映射器的消息转换器(例如xml config中的示例):

<bean id="htmlEscapingObjectMapper" class="com.example.HtmlEscapingObjectMapperFactory" />

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" p:objectMapper-ref="htmlEscapingObjectMapper" />
    </mvc:message-converters>
</mvc:annotation-driven>

现在,由创建的所有JSON消息@ResponseBody都应具有HTMLCharacterEscapes中指定的转义字符串。

该问题的替代解决方案:

  • 对象反序列化后,XSS可以在控制器主体中逃脱所需的操作
  • 也许XSS在输出内容之前先在客户端的javascript中转义

除了进行输出转义之外,还可以进行一些输入验证(使用标准的Spring验证方法)来阻止一些您不想输入到系统/数据库中的内容,这可能是有用的。

编辑:JavaConfig

我还没有尝试过,但是在Java配置中它应该像这样工作(您不需要上面的Factory Bean,因为在这种情况下您可以在config中设置所有内容):

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    super.configureMessageConverters(converters);
    converters.add(buildHtmlEscapingJsonConverter());

}

private MappingJacksonHttpMessageConverter buildHtmlEscapingJsonConverter() {
    MappingJacksonHttpMessageConverter htmlEscapingConverter = new MappingJacksonHttpMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.getJsonFactory().setCharacterEscapes(new HTMLCharacterEscapes());
    htmlEscapingConverter.setObjectMapper(objectMapper);
    return htmlEscapingConverter;       
}

请注意,现在通常配置的所有其他非json默认消息转换器(例如XML转换器等)都将丢失,并且如果需要它们,则需要手动添加它们(您可以看到默认情况下处于活动状态)在第2.2节中:http : //www.baeldung.com/spring-httpmessageconverter-
rest



 类似资料:
  • 我正在设置RestController以接收一个json,其中包含另一个json(我现在不知道第二个json的结构)。。。比如: 我的请求类是这样的: 但是当我调用我的控制器时,

  • 我正在尝试将数据从应用程序上传到Spring后端服务。要上传的内容是一个DataModel,其中包含要创建的对象的数据和链接到数据的几个图像。因此,我使用此方法签名: 我尝试使用注释,但要么得到一个空白的图像数组,要么助手为空。你将如何解决这个问题? 提前谢谢。

  • 这里,整个“service.getdata”语句应该是一个匹配项,但它在(转义的)双引号处中断。如果我用双引号括起参数值,它就可以工作了(就像它在前面的示例块中所做的那样)。但不幸的是,当参数值没有用双引号包装时,我需要它也能工作。 有人能帮我做最后一块吗?

  • 本文向大家介绍SpringMVC的@InitBinder参数转换代码实例,包括了SpringMVC的@InitBinder参数转换代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringMVC的@InitBinder参数转换代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以上就是本文的全部内容,希望对大家的学习有所

  • 问题内容: 嗨,假设我有字符串 请注意转义的反斜杠。 如何将其转换为相应的unicode字符串? 问题答案: print ‘test \u0259’.decode(‘unicode-escape’) test ə

  • 我有一个使用框架的应用程序,该框架通过框架中的XML文件提供某些SpringBean。我的应用程序的配置目前部分使用XML完成,但大部分使用Spring注释。 一些XMLBean定义的父项引用框架提供的bean,例如。 FramwworkBean在框架中的XML文件中定义。有一个豆子传承的链条。在每个步骤中,一些条目被添加到上下文中: 我知道这一切的结果是构造一个ClassWithContext实