ruby-on-rails - 如何在HTML文档中用</script>安全地嵌入JSON?

标签 ruby-on-rails json ruby-on-rails-3 html-parsing

在Rails 3.1应用程序中,如何安全地将一些JSON数据嵌入HTML文档中?

假设我在 Controller 操作中具有此功能:

@tags = [
    {name:"tag1", color:"green"}, 
    {name:"</script><b>I can do something bad here</b>", color:"red"}
]

而这在相应的 View 中:
<script type="text/javascript" charset="utf-8">
    //<![CDATA[
    var tags_list = <%= @tags.to_json %>;
    // ]]>
</script>

然后,我得到的结果是HTML:
var tags_list = [
    {&quot;name&quot;:&quot;tag1&quot;,&quot;color&quot;:&quot;green&quot;},
    {&quot;name&quot;:&quot;&lt;/script&gt;&lt;b&gt;I can do something bad here&lt;/b&gt;&quot;,&quot;color&quot;:&quot;red&quot;}
];

这会在Chrome中触发SyntaxError: Unexpected token &
如果我使用<%=raw tags.to_json %>删除了Rails的默认HTML转义符,那么它将返回以下内容:
var tags_list = [
    {"name":"tag1","color":"green"},
    {"name":"</script><b>I can do something bad here</b>","color":"red"}
];

当然,这会使用</script>破坏HTML文档。

我可以以某种方式告诉to_json()方法返回类似以下的内容:
var tags_list = [
    {"name":"tag1","color":"green"},
    {"name":"&lt;/script&gt;&lt;b&gt;I can do something bad here&lt;/b&gt;","color":"red"}
];

我在rubyonrails-talk邮件列表上问了这个问题,现在我知道有些人认为这是一个非常糟糕的主意,但在我的情况下,只要数据中没有HTML特殊字符,它就可以很好地工作。因此,我只想使to_json HTML返回的字符串安全,并且仍然让JavaScript正确解析它。

更新:
基于@coreyward注释,我确实将其设为JS字符串文字,并且现在看来效果很好。它的解决方案并不像我期望的那么优雅,但是也不错。这是对我有用的代码:
<% tags = [{name:"tag1", color:"green"}, {name:"</script><b>I can \n\ndo something bad here</b>", color:"red"}] %>

<script type="text/javascript" charset="utf-8">
    //<![CDATA[
    var tags_list = $.parseJSON('<%=j tags.to_json.html_safe %>');
    // ]]>
</script>

结果是:
<script type="text/javascript" charset="utf-8">
    //<![CDATA[
    var tags_list = $.parseJSON('[{\"name\":\"tag1\",\"color\":\"green\"},{\"name\":\"<\/script><b>I can \\n\\ndo something bad here<\/b>\",\"color\":\"red\"}]');
    // ]]>
</script>

最佳答案

如果您使用@tags.to_json启用以下代码,则该代码可在rails3中使用:

   ActiveSupport.escape_html_entities_in_json = true

否则,您的另一个选择是:
   var tags_list = <%= raw @tags.to_json.gsub("</", "<\\/") %>;

这样可以节省客户端不得不通过$解析整个内容的过程

关于ruby-on-rails - 如何在HTML文档中用</script>安全地嵌入JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205902/

相关文章:

ruby-on-rails - 用于 Ruby/Rails 的基于组件的 UI 框架?

ruby-on-rails-3 - 事件管理员 has_many 通过删除关联

ruby-on-rails - Docker 镜像在 Ubuntu 16.04 上工作,但在 Ubuntu 18.04 上失败

ruby-on-rails - Carrierwave 图像上传在参数处返回空

c++ - “wcsncasecmp”未在此范围内声明

jquery - 创建 Python 代码来为 jQuery 数据表提供 json 数据

ruby-on-rails - 微型模型操作后,Rails 不会保存到数据库

ruby-on-rails - 使用委托(delegate)类型处理委托(delegate)者的验证错误

php - 是否存在关于 json_decode 在有效 JSON 字符串上返回 NULL 的 PHP 5.3 错误?

ruby-on-rails - ActiveRecord 查找并仅返回选定的列