【问题标题】:html_safe and gsubhtml_safe 和 gsub
【发布时间】: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


【解决方案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!

【讨论】:

  • 另一种方法是使用模板语言,如mustache.github.com
  • 是的,尽管在查看 mustache 时,我似乎无法从模板端定义任何参数。例如,对于我的索引栏,我允许使用参数: 表示使用范围算法并深入两层。我想另一种模板语言(例如液体)会提供此功能。好主意:)
【解决方案2】:

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

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

【讨论】:

  • 谢谢你,我用一个简单的例子更新了答案 :) 不幸的是,我不能很快更新到 Rails 3,更新到 2.3.12 已经够吓人的了(这是一个很大的应用程序)。任何想法将不胜感激:)
猜你喜欢
  • 2014-01-11
  • 2012-03-30
  • 2012-03-23
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多