html_safe和gsub

时间:2011-06-27 08:28:56

标签: ruby-on-rails gsub html-safe

在我的CMS应用程序中,我使用gsub用应用程序中的动态代码替换用户提供的html模板(字符串)的部分内容(例如来自用户的注释或页面内容)。我正在从Rails 2.3.5升级到2.3.12,准备转移到Rails 3并安装了rails_xss gem来尝试将我的字符串排序。

我想知道是否有办法将字符串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'))

这些是简单的情况,我也有注释中包含实际参数(例如,指定绘制索引栏的深度级别,页面上可能有多个级别)。我使用scan查找详细信息,然后再次使用gsub将注释替换为实际的索引条代码。

我对任何重构建议都持开放态度,因为这是我的代码区域,根本不满足我。

2 个答案:

答案 0 :(得分:1)

从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!< / p>

答案 1 :(得分:0)

我相信(虽然我现在找不到提交)最近发布的rails 3之一(我认为3.0.7或3.0.8)解决了围绕这个问题的一些安全问题。

Gsubbing用户输入感觉有点像代码味道,也许你可以提供一些代码,我们可以看一下它的重构吗?