Как HTML-экранирование значений с помощью генератора Джексона - PullRequest
4 голосов
/ 15 февраля 2011

Мы генерируем множество JSON-объектов, используя Spring и его встроенный MappingJacksonHttpMessageConverter.Все отлично.

Но теперь я хочу html escape Строковые значения моих (любых) объектов для предотвращения XSS.

Итак, как мне подойти к этой проблеме?Сначала я подумал, что смогу написать собственный объектный сопоставитель и поместить его в MappkingJacksonHttpMessageConverter.Однако writeValue принимает Object, и я не хочу этого, я хочу, чтобы его поля перебирались.Вместо того, чтобы делать это самостоятельно, держу пари, что конвертер Джексона тоже должен это делать.Поэтому я хочу повлиять на эту часть.

Теперь я получаю интерфейс SerializerProvider.Стандартная реализация (StdSerializerProvider) вызывается ObjectMapper.Так что где-то там я хочу переопределить / повлиять на метод, который отвечает за установку значений.

Возможно ли это?Насколько я вижу, это трудно расширить.Я не могу переопределить StdSerializerProvider для переопределения метода, который использует ObjectMapper.Возможно, мне нужно переопределить еще один?

Или, может быть, это совершенно неправильно, и мне нужно подойти к нему с совершенно другой точки зрения?

Есть какие-нибудь мысли?

Кстати, собственно, я могу реализовать SerializerProvider и создать композит, который делегирует StdSerializerProvider, но я бы предпочел этого не делать.(У меня уже есть проблемы с созданием экземпляра StdSerializerProvider).

Любые мысли приветствуются!

Ответы [ 2 ]

4 голосов
/ 16 февраля 2011

Есть несколько способов, в зависимости от того, как вы можете определить вещи, которые вы хотите избежать. Некоторые мысли:

  • Если вы хотите заключить в кавычки / экранировать все строки, вы можете определить собственный сериализатор String
  • Сначала можно сериализовать как дерево JSON (JsonNode) - ObjectMapper.convertValue (pojo, JsonNode.class) - изменить его, а затем сериализовать в JSON (ObjectMapper.writeValue (middleTree))
  • Если вам нужна гибкая система, в которой вы можете добавить аннотацию для полей, требующих специальной обработки, вы можете использовать функцию Jackson 1.7 в ContextualSerializer; Пользовательский сериализатор, который может перенастроить себя на основе аннотаций. Поначалу это может показаться излишним, но это можно использовать для простого указания пользовательских модификаторов (свойство аннотации со значением Class, которое указывает объект, который сериализатор может вызвать для изменения сериализуемого значения - как escape)
1 голос
/ 15 февраля 2011

Этот ответ был дан, в то время как вопрос был о проверке , что строка не содержит XSS и не экранирована. Этот ответ не поможет вам, если вы хотите избежать строк.

Как насчет проверки созданного объекта (Command Object) с помощью JSR 303 Bean Validation ?

Например, используя not @NotHtml (аннотацию и проверку) для свойств String «Командного объекта».

( Конечно, вы должны добавить аннотации и валидатор @NotHtml (@NotJavaScript или @NotXSS) к себе. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...