Как я могу текстиль и дезинфицировать HTML? - PullRequest
5 голосов
/ 02 февраля 2009

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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 04 февраля 2009

Для тех, кто сталкивается с той же проблемой: если вы используете 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

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

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

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

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

2 голосов
/ 09 сентября 2010

Это работает для меня и защищает от каждой попытки XSS, которую я пробовал, включая обработчики onmouse ... в блоках pre и code:

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

Первоначальная очистка удаляет множество потенциальных XSS-эксплойтов, включая наведение мыши.

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

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

"</body>Foo" 

и он полностью убрал метку жулика

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

0 голосов
/ 02 февраля 2009

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

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

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

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

...