gpt4 book ai didi

ajax - Spring 3.2.4 中 @InitBinder 和 @RequestBody 转义 XSS

转载 作者:行者123 更新时间:2023-12-02 18:25:49 24 4
gpt4 key购买 nike

我的方法中有一个 @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 {

.....
}

然后我在同一个 Controller 中有一个 @InitBinder 带注释的方法:

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

我的StringEscapeEditor没有运行。但我的 initBinder 方法是。所以它不会将我的表单映射到转义编辑器。这似乎在阅读此线程后就正确了(@RequestMapping 似乎不受 @InitBinder 支持):

spring mvc @InitBinder is not called when processing ajax request

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

这在我的应用程序中是一件大事,因为我的大部分绑定(bind)都是通过 @RequestBody 完成的,如果我可以对其应用一些自定义绑定(bind),那就太好了。

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

最佳答案

为了逃避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 的灵感来自于这个问题:HTML escape with Spring MVC and Jackson Mapper)

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

<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>

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

问题的替代解决方案:

  • 反序列化对象后,XSS 转义 Controller 主体中所需的内容
  • 在输出内容之前,可能会在客户端的 JavaScript 中进行 XSS 转义

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

编辑:JavaConfig

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

@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 )

关于ajax - Spring 3.2.4 中 @InitBinder 和 @RequestBody 转义 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25403676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com