1

在我的 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'))

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

我完全愿意接受任何重构建议,因为这是我的代码中根本无法满足我的一个领域。

4

2 回答 2

1

从 rails/rails_xss(而不是 NZKoz 的)安装最新插件后,我开始收到错误消息,说不允许使用 gsubing 安全缓冲区。很公平 :)

我提出了这个作为替代方案,如果有人可以保证它的正确性,我会接受这个作为正确答案:

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!

于 2011-06-30T04:34:47.503 回答
0

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

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

于 2011-06-27T09:07:30.080 回答