html_safe и gsub - PullRequest
       31

html_safe и gsub

1 голос
/ 27 июня 2011

В моем приложении CMS я использую gsub для замены частей предоставленного пользователем HTML-шаблона (строки) динамическим кодом из приложения (например, комментарием от пользователя или содержимым страницы).Я обновляю Rails 2.3.5 до 2.3.12 в рамках подготовки к переходу на Rails 3 и установил гем rails_xss, чтобы попытаться отсортировать мои строки.

Интересно, есть ли способСтроки gsub в другую строку (шаблон), считая входящую строку небезопасной, а разделы шаблона - безопасными?

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

ОБНОВЛЕНИЕ

Вот пример того, что я сейчас делаю.Это в помощнике, который вызывается из макета.Тема взята из базы данных.Это просто строка с определенными комментариями HTML, которую мы хотим заменить фактическим содержанием:

final_theme.gsub!('<body>', '<body>' + (render '/user_bars/user_bar'))
final_theme.gsub!('</body>', (render '/theme/google_analytics') + '</body>') if SiteSetting.first.google_analytics_code.present?
final_theme.gsub!('<!--THEME_MetaTitle-->', (render '/theme/meta_title'))
final_theme.gsub!('<!--THEME_Breadcrumbs-->', (render '/theme/breadcrumbs'))
final_theme.gsub!('<!--THEME_Footer-->', (render '/theme/footer'))
final_theme.gsub!('<!--THEME_Body-->', (render '/theme/body'))

Это простые случаи, у меня также есть комментарии, в которых есть действительные параметры (например, чтобы указать, какмного уровней в глубину, чтобы нарисовать индексную полосу, которых может быть много на странице).Я использую скан, чтобы найти детали, а затем снова gsub, чтобы заменить комментарий фактическим кодом indexbar.

Я полностью открыт для любых рекомендаций по рефакторингу, так как это область моего кода, которая не удовлетворяет меняна всех.

Ответы [ 2 ]

1 голос
/ 30 июня 2011

После установки последнего плагина из rails / rails_xss (а не из NZKoz) я начал получать сообщения о том, что gsubing SafeBuffer не разрешен. Достаточно справедливо:)

Я придумаю это как альтернативу и приму это как правильный ответ, если кто-то может ручаться за его правильность:

final_theme = final_theme.html_safe

final_theme = final_theme.split('<!--THEME_Breadcrumbs-->').inject do |output, piece| 
  output + render('/theme/breadcrumbs') + piece
end

Это всего лишь выдержка, но мы в основном помечаем оригинальную тему как безопасную (потому что она есть), а затем разделяем на интересующую часть, вводя наш новый код в смесь, объединяя строки вместе, обеспечивая таким образом html_safeness!

0 голосов
/ 27 июня 2011

Я полагаю (хотя я не могу найти коммит прямо сейчас), там один из недавних выпусков rails 3 (3.0.7 или 3.0.8, я думаю) исправил ряд проблем безопасности вокруг этой самой проблемы.

Gsubbing пользовательского ввода ощущается как запах кода, возможно, вы можете предоставить некоторый код, и мы можем посмотреть на его рефакторинг?

...