在我的 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 将注释替换为实际的索引条代码。
我完全愿意接受任何重构建议,因为这是我的代码中根本无法满足我的一个领域。