3

假设我正在输出一个帖子标题,并且在我们的数据库中,它是Hello Y’all- 我可以在不使用 的情况下输出它.html_safe,但是以这样一种方式,它不会在 html 中输出为Hello Y’all?

也就是说,如果用户从使用印刷正确撇号的文字处理器复制帖子标题,我会得到乱码输出,因为它&在数据库中转义为&. 当然,我想从数据库中Bonnie & Clyde输出一个标题,Bonnie & Clyde因为那是正确的 HTML ......

有没有安全的方法来做到这一点?

4

4 回答 4

10

使用ActionView::Helpers::SanitizeHelper

<%= "Hello Y&#8217;all" %>
<%= sanitize "Hello Y&#8217;all" %>

将产生:

Hello Y&#8217;all
Hello Y’all
于 2013-06-08T22:57:02.250 回答
1

有 3 种方法可以做到这一点:

1: "string".htmlsafe
2: <%= raw "string" %>
3. <%== "string" %>

我认为您应该使用 <%= raw "string" %> 作为参数,将 .to_s 应用于它,然后简单地将 html_safe 应用于它。因此使用第二个选项是安全的。

于 2012-11-05T18:44:51.340 回答
1

SafeBuffer 调用ERB::Util.h的字符串不是html_safe,因此您可以在首次将字符串保存到数据库中时打开gsubERB::Util.h(your_string)替换 的实例。这样你的字符串首先被消毒&amp;[code]&[code];

您需要的电话是ERB::Util.h(your_string).gsub(/&amp;(#x?[\da-fA-F]+;)/, '&\1')

然后,每当您需要显示该特定字符串时,请调用html_safe它。

于 2012-11-05T20:17:14.400 回答
0

<%= raw "Y&amp;#8217;all" %>或者<%== "Y&amp;#8217;all" %>是两种可能。

于 2012-11-05T18:46:43.370 回答