安全地将Ruby对象传递给JavaScript
我有一个包含用户生成字符串的Ruby哈希。我需要将此散列传递给JavaScript,以便可以对其进行处理。我尝试过使用JSON,它在大多数情况下都有效,但当哈希包含文本安全地将Ruby对象传递给JavaScript,javascript,ruby,json,Javascript,Ruby,Json,我有一个包含用户生成字符串的Ruby哈希。我需要将此散列传递给JavaScript,以便可以对其进行处理。我尝试过使用JSON,它在大多数情况下都有效,但当哈希包含文本时就会中断。以下是Chrome和FF8中最简单的代码: <% obj = { :foo => '</script>' } %> <script type="text/javascript"> var obj = <%= obj.to_json %>; // Results
时就会中断。以下是Chrome和FF8中最简单的代码:
<%
obj = {
:foo => '</script>'
}
%>
<script type="text/javascript">
var obj = <%= obj.to_json %>; // Results in JS syntax error
</script>
语法错误似乎是由于浏览器试图将
文本解释为脚本块的结尾。我目前的解决方案是将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>
“”
}
json=obj.to_json
escape_json=CGI.escapeHTML(json)
斜杠\u-escaped\u-json=escaped\u-json..gsub(/['“\\\x0]/,'\0')
%>
var json=“”;
json=$('').html(json.text();//unescape html
var obj=jQuery.parseJSON(json);//安全地解析json
控制台日志(obj);
它可以工作,但很难看。有更好的方法吗?我不想去掉
,因为我要在页面上呈现内容之前将内容转义为HTML实体。如果您认为这是浏览器的问题,请显示结果标记,而不是ruby
过去,我通过在服务器端对json进行base64编码来解决类似问题。然后在客户端对其进行解码和json解析。如果您认为这是浏览器的问题,请显示结果标记,而不是ruby
过去,我在服务器端对json进行base64编码,然后在客户端对其进行解码和json解析,从而解决了类似的问题。您有什么理由不只是对服务器进行另一次回调以在另一个请求中获取json,比如:
var foo;
jQuery.get('/your_controller/' + resource_id + '/controller_action.json', null, function(data) {
try {
foo = data
} catch (e) {
console.log("Error get data: " + e.message);
}
});
{"foo":"<\/script>"}
我真的不知道您的应用程序是什么,但这是一个可行的选项。您有什么理由不只是对服务器进行另一次回调以获取另一个请求中的JSON,比如:
var foo;
jQuery.get('/your_controller/' + resource_id + '/controller_action.json', null, function(data) {
try {
foo = data
} catch (e) {
console.log("Error get data: " + e.message);
}
});
{"foo":"<\/script>"}
我真的不知道你的应用程序是什么,但这是一个可行的选项。结果表明这是Ruby的“json”gem中的一个bug。我在GitHub上找到了源代码,并在队列中找到了这个拉取请求: 解决方案是转义正斜杠,产生如下JSON:
var foo;
jQuery.get('/your_controller/' + resource_id + '/controller_action.json', null, function(data) {
try {
foo = data
} catch (e) {
console.log("Error get data: " + e.message);
}
});
{"foo":"<\/script>"}
{“foo”:“}
感谢您的帮助,我希望此解决方案能帮助其他人!这是Ruby的“json”gem中的一个bug。我在GitHub上找到了源代码,并在队列中找到了此pull请求: 解决方案是转义正斜杠,产生如下JSON:
var foo;
jQuery.get('/your_controller/' + resource_id + '/controller_action.json', null, function(data) {
try {
foo = data
} catch (e) {
console.log("Error get data: " + e.message);
}
});
{"foo":"<\/script>"}
{“foo”:“}
感谢您的帮助,我希望此解决方案能帮助其他人!我已根据您的评论更新了问题。我考虑了Base64,但在我丑陋的解决方案中使用了html编码。它实现了相同的结果,但我仍然觉得不对:(我已经根据你的评论更新了这个问题。我考虑了Base64,但在我丑陋的解决方案中使用了html编码。它实现了相同的结果,但我仍然觉得不对:(这是一个非常好的主意,但为什么两个请求可以在一个中完成?这是一个非常好的主意,但为什么两个请求可以在一个中完成?