2009-02-01 2 views
5

Теперь я столкнулся с какой-то глупой ситуацией. Я хочу, чтобы пользователи имели возможность использовать текстиль, но они не должны возиться с моим действительным HTML вокруг их записи. Поэтому мне нужно как-то избежать HTML.Как мне текстиль и дезинфицировать html?

  • html_escape(textilize("</body>Foo")) сломается текстильный в то время как

  • textilize(html_escape("</body>Foo")) будет работать, но разрушает различные текстильные функции, такие как ссылки (написанные как "Linkname":http://www.wheretogo.com/), так как котировки будут преобразованы в &quot; и, таким образом, не обнаруживается текстильной больше.

  • sanitize не делает лучшую работу.

Любые предложения по этому вопросу? Я бы предпочел не использовать Tidy для решения этой проблемы. Спасибо заранее.

ответ

7

Для тех, кто сталкивается с той же проблемой: Если вы используете RedCloth gem, вы можете просто определить свой собственный метод (в одном из ваших помощников).

 
def safe_textilize(s) 
    if s && s.respond_to?(:to_s) 
    doc = RedCloth.new(s.to_s) 
    doc.filter_html = true 
    doc.to_html 
    end 
end 

Выдержка из документации:

Accessors для установления ограничений безопасности.

Это хорошая вещь, если вы используете RedCloth для форматирования в общественных местах (например, Wikis), где вы не хотите, чтобы пользователи злоупотребляли HTML-кодом для плохих вещей.

Если установлен filter_html, HTML, который не был создан процессором Textile, будет экранирован. В качестве альтернативы, если установлен sanitize_html, HTML может проходить через процессор Textile , но неавторизованные теги и атрибуты будут удалены.

+1

Но остерегайтесь эксплойтов pre и code tag. например. (смею рисковать этим?)

!!!!mouse trap!!!!

0

Похоже, что текстиль просто не поддерживает то, что вы хотите.

Вы действительно хотите разрешить только контролируемое подмножество HTML, но текстиль предназначен для произвольного HTML. Я не думаю, что вы можете использовать текстиль вообще в этой ситуации (если только это не поддерживает такое ограничение).

Возможно, что вам нужна специальная «ограниченная» версия текстиля, которая позволяет только «безопасную» разметку (определение того, что, возможно, уже сложно). Однако я не знаю, существует ли это.

Возможно, вы можете взглянуть на BBCode, что позволяет ограничить возможную разметку.

+0

Там в также Markdown (в котором используется переполнение стека), http://daringfireball.net/projects/markdown/ –

+0

Да, подумал и о уценке. Но stackoverflow AFAIK делает дополнительное ускорение (некоторые blogpost Джеффа указали на это). Markdown также позволяет произвольный HTML. –

+0

@David Zaslavsky: Читайте на официальном сайте (http://daringfireball.net/projects/markdown/syntax#overview): «Для любой разметки, которая не покрывается синтаксисом Markdown, вы просто используете сам HTML». – Vanuan

2

Это работает для меня и охранников против всех XSS атак Я попытался включая onmouse ... обработчиков в заранее и блоках коды:

<%= RedCloth.new(sanitize(@comment.body), [:filter_html, :filter_styles, :filter_classes, :filter_ids]).to_html -%> 

Начальная Sanitize удаляет много потенциальных XSS атак, использующие в том числе наведение.

Насколько я могу судить: filter_html избегает большинства тегов html, кроме кода и pre.Другие фильтры существуют, потому что я не хочу, чтобы пользователи применяли какие-либо классы, идентификаторы и стили.

Я просто проверял мою страницу комментариев с вашего примером

"</body>Foo" 

и полностью удалить изгой тело тег

Я использую RedCloth версию 4.2.3 и Rails версию 2.3.5