如何在HTML文档中安全地嵌入JSON和</ script>?
在Rails 3.1应用程序中,如何安全地将一些JSON数据嵌入到HTML文档中?
假设我有一个控制器动作:
@tags = [
{name:"tag1", color:"green"},
{name:"</script><b>I can do something bad here</b>", color:"red"}
]
这与此相对应:
<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 nndo 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 nndo something bad here</b>","color":"red"}]');
// ]]>
</script>
只需使用@tags.to_json
代码就可以在@tags.to_json
运行,如果通过以下方式启用它:
ActiveSupport.escape_html_entities_in_json = true
否则,你的其他选择是这样的:
var tags_list = <%= raw @tags.to_json.gsub("</", "</") %>;
这节省了客户必须通过$解析整个事情
顺便说一句,这工作,但不是在我看来很好的解决方案:
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tags_list = <%=raw @tags.to_json.gsub('/', '/') %>;
// ]]>
</script>
我认为,如果你尝试这个方法,它会起作用:
var tags_list = "<%== @tags.to_json.gsub('/', '/') %>";
(注意double ==和“”)
链接地址: http://www.djcxy.com/p/47927.html上一篇: How to safely embed JSON with </script> in HTML document?