在Rails 3中强制HTML中分离(Forcing HTML Escaping in Rails

2019-07-29 18:30发布

我运行到与导轨自动转义的问题。 目前,它认为一个字符串是html_safe(这是),但为了显示我需要它仍然逃脱的HTML。 这里的字符串采取的步骤。

my_string = render(:partial => "set_string", :locals => {:item => @item})
<%= my_string %>

和部分基本上是

<h2>Page Header</h2>
<strong><%= item.name %></strong>
<%= item.body %>
etc

我的理解是,因为我在一个视图中显示的文本直接(在H2等),它假定它是安全的,并且它也逃脱适当的项目产出,这使得整个my_string安全。 所以,当我尝试与显示它

<%= my_string %>

它不会逃避剩余的HTML。 我尝试添加小时,以迫使逃逸,但没有奏效。

所以我的问题是,反正是有强制HTML比调用的字符串,这将使它不安全的东西以外的安全的字符串的逃避?

非常感谢你的帮助。

Answer 1:

从的ActiveSupport :: SafeBuffer Rails中逃生3+

在这种情况下<%= my_string.to_str %>根据需要将双逃逸。

SafeBuffer运作

当一个字符串由Rails的逃脱你得到ActiveSupport::SafeBuffer 。 从这一点来说,额外的转义被跳过,因为SafeBufferhtml_safe? 。 这是一个聪明的解决方案! 有很多次,虽然,我们希望避免这样的小聪明。

为什么双逃脱呢?

我需要重新越狱按标签助手生成所产生的标记传递给内容 data-属性。 这也派上用场,用于显示模板生成的代码。

强制逃生的String这是html_safe?

调用to_strSafeBuffer ,它返回一个String

# Example html safe content
content = content_tag :code, 'codez<>'
content.html_safe? # true

# call .to_str
escaped = content.to_str
escaped.html_safe? # false

# The escaped String will now be re-escaped when used in a template

to_s疑难杂症

to_s方法看起来非常像to_str方法。 不要使用to_s这里ActionView::SafeBuffer#to_s刚刚返回self ,在to_str被称为以上SafeBuffer背景下,返回自然不安全的String



Answer 2:

由于塞巴斯蒂安您的建议,我想来到这里,而不是真正的答案埋在评论:

我是这样工作的:

<%= raw CGI::escapeHTML(my_string) %>

你还需要“原始”的呼叫,否则escapeHTML使得字符串除了逃脱它不安全,因此汽车逃跑双逃脱它。



Answer 3:

为了解释HTML(这是我的理解,你需要),你必须使用:

<%= raw my_string %>


文章来源: Forcing HTML Escaping in Rails 3