Как безопасно встроить JSON с помощью в HTML-документ?

В приложении 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 = [
    {&quot;name&quot;:&quot;tag1&quot;,&quot;color&quot;:&quot;green&quot;},
    {&quot;name&quot;:&quot;&lt;/script&gt;&lt;b&gt;I can do something bad here&lt;/b&gt;&quot;,&quot;color&quot;:&quot;red&quot;}
];

, который запускает SyntaxError: Неожиданный токен и в Chrome

Если я удалю стандартный HTML-код Rails с экранированием с помощью <% = raw tags.to_json %> , затем он возвращает следующее:

var tags_list = [
    {"name":"tag1","color":"green"},
    {"name":"</script><b>I can do something bad here</b>","color":"red"}
];

, что, конечно же, разбивает HTML-документ на .

Могу ли я каким-то образом указать методу to_json () вернуть что-то еще вот так:

var tags_list = [
    {"name":"tag1","color":"green"},
    {"name":"&lt;/script&gt;&lt;b&gt;I can do something bad here&lt;/b&gt;","color":"red"}
];

Я задал этот вопрос в списке рассылки rubyonrails-talk, и теперь я понимаю, что некоторые люди думают, что это очень плохая идея для начала, но в моем случае это работает очень хорошо, пока нет HTML специальные символы в данных. Поэтому я просто хочу, чтобы строка, возвращаемая to_json HTML, была безопасной и при этом JavaScript правильно ее анализировал.

ОБНОВЛЕНИЕ: Основываясь на комментарии @coreyward, я сделал его строковым литералом JS, и теперь, похоже, он отлично работает. Это не такое элегантное решение, как я надеялся, но и не так уж и плохо. Вот код, который у меня работает:

<% tags = [{name:"tag1", color:"green"}, {name:"</script><b>I can \n\ndo 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 \\n\\ndo something bad here<\/b>\",\"color\":\"red\"}]');
    // ]]>
</script>
21
задан nnc 7 March 2013 в 07:46
поделиться