【发布时间】:2011-06-27 08:28:55
【问题描述】:
在我的 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'))
这些都是简单的案例,我也有包含实际参数的 cmets(例如,指定绘制索引栏的深度,其中页面上可能有很多层)。我使用扫描查找详细信息,然后再次使用 gsub 将注释替换为实际的索引条代码。
我完全愿意接受任何重构建议,因为这是我的代码中根本不满足我的一个领域。
【问题讨论】:
-
现在我玩得更多了,看来如果我只是在开始时将我的 final_theme 标记为 html_safe,只要我在
render调用中 gsub,渲染似乎就可以处理对我来说,这些部分的 html 安全性。很有趣。
标签: ruby-on-rails gsub html-safe