在我的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将注释替换为实际的索引条形码。
我完全接受任何重构建议,因为这是我的代码中一个根本不能让我满意的领域。
从rails/rails_xss(而不是NZKoz的)安装最新插件后,我开始收到错误,说不允许使用安全缓冲区。公平:)
我已经提出了这个替代方案,如果有人能保证它的正确性,我会接受这个作为正确答案:
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!
我相信(尽管我现在找不到提交)最近发布的rails 3(我认为是3.0.7或3.0.8)解决了围绕这个问题的许多安全问题。
Gsubbing用户输入感觉有点代码味,也许你可以提供一些代码,我们可以考虑重构它?