responsebody - HTML escape con Spring MVC y Jackson Mapper
spring request (1)
Voy a escapar de HTML en Spring MVC con Jackson Mapper para evitar el ataque XSS.
Busco escaparse con Jackson solo y cómo configurar a Jackson en Spring.
Intenté exportar JSON con texto como "<" ">", espero escapar de ellos a <
y >
por ejemplo, agregué un texto adjunto con "etiqueta en negrita" <b>
, espero ver texto en negrita simple en el html del anverso, pero al final el texto se muestra en negrita en la página html del anverso.
Debajo está mi enfoque, no sé por qué no funcionó.
Cualquiera puede ayudar?
¡Gracias por adelantado!
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
this.getJsonFactory().setCharacterEscapes(new CustomCharacterEscapes());
}
}
public class CustomCharacterEscapes extends CharacterEscapes {
private final int[] asciiEscapes;
public CustomCharacterEscapes() {
int[] esc = CharacterEscapes.standardAsciiEscapesForJSON();
esc[''<''] = CharacterEscapes.ESCAPE_STANDARD;
esc[''>''] = CharacterEscapes.ESCAPE_STANDARD;
esc[''&''] = CharacterEscapes.ESCAPE_STANDARD;
esc[''/'''] = CharacterEscapes.ESCAPE_STANDARD;
asciiEscapes = esc;
}
@Override
public int[] getEscapeCodesForAscii() {
return asciiEscapes;
}
@Override
public SerializableString getEscapeSequence(int ch) {
return null;
}
}
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<array>
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper">
<bean class="x.y.z.CustomObjectMapper" />
</property>
</bean>
</array>
</property>
</bean>
Nunca he tratado de escribir mi propio HttpMessageConverter, pero encontré esta publicación que parece bastante relavent a lo que quieres hacer. Al ver su solución frente a lo que publicaste aquí, puedo decir que las mayores diferencias que noté fue que no pareces implementar / anular lo siguiente:
- soportes booleanos protegidos (Clazz de clase), que indica el tipo de clase que está soportando (lo reconocería en su caso sería Object o Serializable si desea que sea lo suficientemente genérico para manejar todas las posibilidades, o alguna clase específica para sus objetos de dominio )
- protected Object readInternal (Class clazz, HttpInputMessage inputMessage), parece que se usa para el lado de la solicitud
- protected void writeInternal (Object t, HttpOutputMessage outputMessage), que parece que se usa para el lado de respuesta
Otro enfoque podría ser simplemente crear un serializador Jackson personalizado junto con @ResponseBody. O, mejor aún, si tiene un valor que es impulsado por el usuario y lo almacena en una base de datos, evite los valores antes de la inserción. De esta forma, no es necesario que haga nada en absoluto, y los valores en cuestión serían "seguros" de extremo a extremo. Si quisieras volverte loco, podrías escribir un editor de propiedades java.beans personalizado que escapa de cadenas para HTML y conectarlo a la mezcla usando InitBinder.
Finalmente, me gustaría recomendar que, en lugar de tratar de reemplazar los personajes por su cuenta, use algo como StringEscapeUtils de Apache Commons-Lang para escapar de los valores.