javascript - 安全地将 Ruby 对象传递给 JavaScript

标签 javascript ruby json

我有一个包含用户生成的字符串的 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/

相关文章:

javascript - 从数组中返回排序后的唯一值,但如果计数相等,则按顺序返回值

javascript - 如何将表单中的值分配给 Javascript session 变量

ruby - 为什么 Ruby 中有 0.0 和 -0.0?

json - Elasticsearch :在一个查询中进行多项搜索

Javascript:TypeError:循环对象值

javascript - 我可以使用 jQuery 轻松地向上或向下移动 li 元素吗?

javascript - 将jquery dataTables(带有CRUD功能)连接到mysql

ruby-on-rails - Rails session 和 SiteMinder/SSO

ruby - Ruby 的 net/http 的客户端带宽使用

java - 服务器到客户端进行json通信的通用java类