【问题标题】:How to deal with HTML entities in Rails to_json output?如何处理 Rails to_json 输出中的 HTML 实体?
【发布时间】:2012-10-08 19:20:06
【问题描述】:

我正在编写一个应用程序,它在后端使用 Rails,在前端使用 javascript/backbone。我正在尝试bootstrap some rails models into my javascript。具体来说,我想将@courses 的内容加载到一个名为window.courses 的js 变量中。我在html.erb 文件中有以下内容。

<%= javascript_tag do %>
    window.courses = JSON.parse('<%= @courses.to_json %>');
<% end %>

我期待 erb 预处理器将其呈现为有效的 javascript,就像这样

<script type="text/javascript">
//<![CDATA[
    window.courses = JSON.parse('[{"code":"myCourseCode", ...
//]]>
</script>

...但是,相反,我得到的代码包含HTML entities。

<script type="text/javascript">
//<![CDATA[
    window.courses = JSON.parse('[{&quot;code&quot;:&quot;myCourseCode&quot;, ...
//]]>
</script>

很明显,当我尝试解析这个时,我得到了 javascript 错误。

有谁知道我可以如何处理这些 HTML 实体以生成有效的 javascript?我意识到一个选择是unescape the entities on the client side,但这似乎是一个迂回的解决方案。有没有办法让 Rails 生成不需要转义的 JSON?

【问题讨论】:

  • 尝试使用&lt;%= raw(@courses.to_json) %&gt;
  • 太棒了,谢谢!我想一定有一个简单的方法来做到这一点。
  • @dB' 你会考虑更新接受的答案吗?这是非常不安全的,并且是许多跨站点脚本漏洞的根源。

标签: javascript ruby-on-rails json


【解决方案1】:

如果您打算使用 raw(obj.to_json),您必须确保已设置以下内容。

ActiveSupport.escape_html_entities_in_json = true 

【讨论】:

    【解决方案2】:

    我的评论解决了这个问题,仅供记录:

    Rails 对使用&lt;%= 'string' %&gt; 打印的字符串进行转义。这样,就可以保存输出用户数据。 因此,如果您不想让 Rails 转义输出,则必须使用 raw('string') 明确告诉 Rails。

    在您的代码中,这将是: &lt;%= raw(@courses.to_json) %&gt;

    【讨论】:

    • 这基本上是在求xss。微不足道。我已经看过数百次了,请永远不要使用 raw。
    • 感谢您的评论@oreoshake。你能给我指个方向吗?
    • 在上面的答案中,我提到了ActiveSupport.escape_html_entities_in_json = true。使用该设置和默认的 json 后端,使用 可以避免 xss。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2012-08-01
    • 2012-02-09
    • 2012-03-25
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多