我有一个包含用户生成的字符串的 Ruby 散列。我需要将此哈希传递给 JavaScript,以便对其进行处理。我尝试过使用 JSON,它在大多数情况下都有效,但当散列包含文本 </script>
时就会中断.这是在 Chrome 和 FF8 中中断的最简单的代码:
<%
obj = {
:foo => '</script>'
}
%>
<script type="text/javascript">
var obj = <%= obj.to_json %>; // Results in JS syntax error
</script>
这会产生以下 HTML:
<script type="text/javascript">
var obj = {"foo":"</script>"};
</script>
我还尝试将 JSON 括在引号中(单引号和双引号),以便可以通过 jQuery.parseJSON()
对其进行解析。 ,但它会导致相同的语法错误:
<%
obj = {
:foo => '</script>'
}
%>
<script type="text/javascript">
var json = '<%= obj.to_json %>'; // Again results in JS syntax error
</script>
语法错误似乎是浏览器试图解释 </script>
的结果文本作为脚本 block 的结尾。我目前的解决方案是将 JSON 字符串转义为 HTML,转义剩余的反斜杠,将其作为字符串写入 JS,取消转义 HTML,最后解析 JSON:
<%
obj = {
:foo => '</script>'
}
json = obj.to_json
escaped_json = CGI.escapeHTML(json)
slashed_escaped_json = escaped_json..gsub(/['"\\\x0]/,'\\\\\0')
%>
<script type="text/javascript">
var json = "<%= slashed_escaped_json %>";
json = $('<div/>').html(json).text(); // unescape HTML
var obj = jQuery.parseJSON(json); // parse JSON safely
console.log(obj);
</script>
它有效,但它很丑。有没有更好的办法?我不想去掉 </script>
因为我在将内容呈现在页面上之前将其转义为 HTML 实体。
最佳答案
如果您认为这是浏览器的问题,请显示生成的标记,而不是 ruby 。
我在过去通过在服务器端对 json 进行 base64 编码来解决类似的问题。然后在客户端对其进行解码和 json.parsing。
关于javascript - 安全地将 Ruby 对象传递给 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235284/