在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 = [
{"name":"tag1","color":"green"},
{"name":"</script><b>I can do something bad here</b>","color":"red"}
];
这会在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":"</script><b>I can do something bad here</b>","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/