Как не преобразовывать специальные символы в html-объекты с помощью owasp antisamy

Я использую Owasp Anti с файлом политики Ebay для предотвращения XSS-атак на свой сайт.

Я также использую поиск Hibernate для индексации своих объектов.

Когда я использую этот код:

String html = "special word: été";    

// use the Ebay configuration file    
Policy policy = Policy.getInstance(xssPolicyFile.getInputStream());

AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(html, policy);

// result is now : "special word: été"
result = cr.getCleanHTML();

Как вы можете видеть, все символы «é» были преобразованы в эквивалентные им HTML-сущности «é».

Моя страница находится в UTF-8, поэтому мне не нужно это преобразование. Более того, когда я индексирую этот текст с помощью Hibernate Search, он индексирует слово с помощью html-объектов, поэтому я не могу найти слово «été» в своем индексе.

Как я могу заставить antisamy не преобразовывать специальные символы в их эквивалент html-сущности?

Спасибо

PS: проблема была открыта: http://code.google.com/p/owaspantisamy/issues/detail?id=99


person Jerome Cance    schedule 14.07.2010    source источник


Ответы (4)


Сегодня утром я столкнулся с той же проблемой.

Я инкапсулировал antisamy в классе и использую apache StringEscapeUtil из apache common-lang для восстановления специальных символов.

 CleanResults cleanResults = antiSamy.scan(taintedHtml);
 cleanedHtml = cleanResults.getCleanHTML();  
 return StringEscapeUtils.unescapeHtml(cleanedHtml)

Результатом является очищенный HTML без экранирования специальных символов HTML.

Надеюсь это поможет.

person Vincent Giguère    schedule 29.10.2010
comment
Это может быть действительно небезопасно, не так ли? Если я уберу : été ‹ hive и после unescape, ‹ вернется, и это опасно... - person Jerome Cance; 28.01.2011
comment
@Jerome C., где можно решить эту проблему? Я получил его, чтобы работать с этим предложением. Почему вы думаете, что это небезопасно? - person Mohamad; 15.06.2011
comment
хорошо, я думаю, что отмена экранирования html, когда антисамия здесь, чтобы избежать, может быть довольно опасной, потому что вы не только преобразуете сущности, но, возможно, кодируете опасные символы, такие как ‹ › ', когда вы отменяете экранирование - person Jerome Cance; 17.06.2011
comment
@ Джером, но если вы сначала используете AntiSamy для очистки ввода, а затем отключаете экранирование, какая разница? - person Mohamad; 19.08.2011
comment
@ДжеромС. Мне просто интересно, какое у вас было решение этой проблемы? AntiSamy был только что обновлен, чтобы включить экранирование специальных символов в директиве. - person Mohamad; 21.09.2011
comment
Большое спасибо, чтобы обновить это! На данный момент у меня нет решения, но кажется, что entityEncodeIntlChars окончательно решит эту проблему. Я еще не тестировал его, но я попробую через несколько недель. - person Jerome Cance; 22.09.2011

Как сказал Мохамад в комментарии, Antisamy только что выпустила новую директиву с именем: entityEncodeIntlChars

вот подробности: http://code.google.com/p/owaspantisamy/source/detail?r=240

Кажется, что эта директива решает проблему.

person Jerome Cance    schedule 22.09.2011
comment
Да, НЕ ИСПОЛЬЗУЙТЕ StringEscapeUtils.unescapeHtml(cleanedHtml), поскольку он делает вас уязвимыми для XSS-атак, как описано в комментариях. При отмене экранирования будут удалены не только сущности, но и любой экранированный HTML-код, существующий в данных. - person Erlend; 14.08.2012

Изучив исходный код AntiSamy, я не нашел способа изменить это поведение, кроме модификации AntiSamy.

person Community    schedule 23.08.2010

Взгляните на это: http://code.google.com/p/owaspantisamy/source/browse/#svn/trunk/dotNet/current/source/owaspantisamy/html/scan

Возьмите исходный код и обратите внимание, что ключевые классы (AntiSamyDOMScanner, CleanResults) используют стандартные объекты фреймворка (например, XmlDocument). Скомпилируйте и запустите с скомпилированным двоичным файлом, чтобы вы могли видеть все в отладчике, например, какой из основных классов фактически искажает ваши данные. Имея это в руках, вы сможете либо изменить несколько свойств основных объектов, чтобы остановить их, либо внедрить собственную постобработку, чтобы исправить ошибку (скажем, с помощью регулярного выражения). Позже вы можете указать это как дополнительное свойство верхнего уровня, скажем, с именем NoMess :-)

Скорее всего, поведение в этом отношении отличается для разных языков (в этом стволе их 3), но одна и та же тактика будет работать независимо от того, с каким из них вам придется иметь дело.

person ZXX    schedule 26.08.2010
comment
Я думал об этом, но это очень сложно, потому что я использую Maven, и поэтому я никогда не загружаю весь исходный код проекта, чтобы изменить его. Странно, что Antisamy не реализует такую ​​функцию. Я думаю, что сделаю это, но это действительно некрасиво. - person Jerome Cance; 27.08.2010
comment
Что ж, это хороший повод начать развязку :-) Также может быть дело в предполагаемом кодировании вывода. - person ZXX; 27.08.2010