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 回答