Как вы декодируете одинарные и двойные кавычки в java?

Я использую AntiSamy для очистки пользовательского ввода, и он работает хорошо. Есть одна проблема: он кодирует одинарные и двойные кавычки. Поэтому, если я хочу что-то отредактировать, вместо my sample's отображается my sample's — одинарная кавычка становится закодированной.

Чтобы уточнить: браузер правильно отображает кавычки, но они сохраняются в моей базе данных как объекты HTML. Поэтому, когда пользователь загружает сообщение для редактирования, объекты HTML отображаются в текстовом поле.

  1. Есть ли способ обойти это ограничение?
  2. Должен ли я использовать / есть ли какой-либо другой инструмент?

Мои пользователи могут публиковать код и множество других вещей. Так что AntiSamy отлично справляется с этой задачей. Но я не хочу преобразовывать одинарные и двойные кавычки в обычный текст.

Какие варианты у меня есть?


person dee    schedule 20.09.2011    source источник


Ответы (2)


Если AntiSamy не имеет реверсивного метода, эта вещь, в частности, может быть обработана StringEscapeUtils.unesacpeHtml(..) из commons-lang.

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

person Bozho    schedule 20.09.2011
comment
извините, я не очень хорошо объяснил. Я говорю о том, что когда пользователь загружает сообщение для редактирования, в текстовом поле отображается необработанный текст, содержащий объекты HTML. Таким образом, AntiSamy кодирует мои данные до того, как они попадут в БД. Это отлично. Я просто не хочу, чтобы он кодировал одинарные и двойные кавычки в обычном тексте, например, как StackOverFlow. Они кодируют все, но кавычки оставляют обычный текст в покое. Я надеюсь, что в этом есть смысл. - person dee; 20.09.2011
comment
Кроме того, нельзя использовать StringUnescapeUtils, так как он может кодировать опасный ввод. Думаю, я просто хочу быть избирательным в отношении того, что я кодирую, а что нет. - person dee; 20.09.2011
comment
тогда мой первый абзац должен вам подойти - person Bozho; 20.09.2011
comment
@dee - используйте его только для отмены экранирования ввода ради отображения. После этого вы снова передадите отредактированный ввод через AntiSamy. - person Bozho; 20.09.2011
comment
StringEscapeUtils не будет работать. Он будет кодировать потенциально опасный ввод. Поскольку он кодирует одинарные кавычки, он также будет кодировать скобки HTML и образцы скриптов, не так ли? - person dee; 20.09.2011
comment
ааа, ок, я понял. Спасибо. - person dee; 20.09.2011
comment
извините, просто уточню: вы имеете в виду, что я должен использовать его при загрузке текста из базы данных для вывода в поля формы? - person dee; 20.09.2011
comment
@ди да. Но учтите одну вещь - вам это нужно только в текстовом поле. Текстовые входы обрабатывают это правильно. А в текстовом поле вам просто нужно проверить, нет ли закрывающего тега </textarea> во входных данных - он испортит страницу - person Bozho; 20.09.2011
comment
Если речь идет только о цитатах, вы также можете воспользоваться предложением Лео. - person Bozho; 20.09.2011

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

Если процесс кодирования является более сложным (например, применяются некоторые белые списки тегов или правила форматирования), вы можете хранить две версии входных данных — закодированную HTML-версию для отображения и необработанную версию для редактирования, а также обновлять HTML-версию, когда необработанная версия модифицированный.

person axtavt    schedule 20.09.2011
comment
благодарю вас. Это немного сложно, потому что некоторые пользователи могут редактировать сообщения других людей. Это означает, что необработанный текст должен быть очищен. Но он должен быть очищен от опасного контента, но при этом должны сохраняться сложные правила форматирования и образец кода... он просто не должен кодировать кавычки в обычном тексте. - person dee; 21.09.2011
comment
отличный пример — как это делает StackOverFlow. Они дезинфицируют все. Но когда вы идете редактировать свой пост, все в порядке. Одинарные и двойные кавычки не кодируются. - person dee; 21.09.2011
comment
@dee: я считаю, что StackOverflow использует второй подход, описанный выше. - person axtavt; 21.09.2011