6

このことを考慮:

<%
str = "http://domain.com/?foo=1&bar=2"
%>

今これらの場合:

<%=str%>
# output:http://domain.com/?foo=1&amp;bar=2

<%=str.html_safe%>
# output:http://domain.com/?foo=1&bar=2

<%="#{str.html_safe}"%>
# output:http://domain.com/?foo=1&amp;bar=2

<%=""+str.html_safe%>
# output:http://domain.com/?foo=1&amp;bar=2

他の文字列と一緒にURLを出力する必要があります。アンパサンドがエスケープされないことをどのように保証できますか?私のコントロールが及ばない理由で、私は送ることができません&amp;

助けてください!ここで私の髪を引っ張る:\

編集:明確にするために、私は実際に次のような配列を持っています:

@images = [{:id=>"fooid",:url=>"http://domain.com/?foo=1&bar=2"},...]

image_arrayこの方法でアプリで使用するJS配列(var)を作成しています:

image_array.push(<%=@images.map{|x|"{id:'#{x[:id]}',url:'#{x[:url].html_safe}'}"}.join(",")%>);

これにより、以下が生成されます。

image_array.push({id:'fooid',url:'http://domain.com/?foo=1&amp;bar=2'},...);

これは私の特定のケースでは機能しません。urlパーツなしで必要amp;です。

4

4 に答える 4

9

あなたが書くとき:

"#{foo.bar}"

これは〜書くことと同等です

foo.bar.to_s

つまり、実際に行っているのは次のとおりです。

<%=str.html_safe.to_s%>

…これはRailsが安全であるとは見なしなくなったため、結果の文字列にHTMLエスケープのラウンドでヒットします。

Railsの内部はわかりませんが、html_safeメソッドはインスタンス変数を使用して文字列オブジェクトを拡張し、OKのフラグを立てると思いますが、補間によって別の文字列でラップすると、そのフラグのない新しい文字列が取得されます。

編集:ニーズに答えるには、最後の文字列を使用rawまたは呼び出しhtml_safeます。

<%=raw "foo#{str}"%>
<%="foo#{str}".html_safe%>

またはあなたの場合:

image_array.push(<%=raw @images.map{…}.join(',')%>);
image_array.push(<%=@images.map{…}.join(',').html_safe%>);

この質問も参照してください。

于 2012-04-19T16:24:42.320 に答える
2

これを使って

    <%=str.html_safe.to_s%>

また

   <%=raw(str)%>   

より良い結果が得られます

于 2012-04-19T16:29:11.270 に答える
0
image_array.push(<%= @images.map{|x| "{id:'#{x[:id]}',url:'#{x[:url]}'}".html_safe }.join(",") %>);
于 2012-04-19T17:04:50.037 に答える
0

安全のためにあなたがすることは次のとおりです。

image_array.push(<%= @images.map { |image| image.as_json(only: [:id, :url]) }.to_json } %>)

<これは、、>などを次のように適切にエスケープします。

[{"name":"\u003ch1\u003eAAAA\u003c/h1\u003e"}]

文字列を連結したい私のようにここに来る人々にとって、それを行うのは安全ではありません。最良の方法はタグを連結することです。

    content_tag(:p) do
      content_tag(:span, "<script>alert(1)</script>") +
        link_to("show", user)
    end

正常に動作し、最初の文字列を適切にエスケープします

于 2019-04-18T12:04:19.410 に答える