RHTML在输出上显示HTML标记

时间:2010-12-15 13:15:05

标签: ruby-on-rails ruby views ruby-on-rails-3 rhtml

我在Rails中有一个RHTML视图,其输出来自我的MongoDB集合。使用迭代块正确输出数据,但每当我尝试在我的数据库中使用HTML标记时,它们都不会在HTML输出中呈现,而只是显示它们。

<%
 @posts.find().each do |post|
%>
 <h1><%=post["name"]%></h1>
 <p><%=post["body"] %></p>
 <p><%=post["timestamp"]%></p>
<%
 end
%>

但是,例如,如果我有

<p>Test</p>

在我的数据库中,标记将被渲染,而不是被打印。

2 个答案:

答案 0 :(得分:6)

这是一项安全预防措施,现已内置到Rails 3中。它可以防止XSS(跨站点脚本)问题。

如果添加raw,您将获得所需的输出。

<% @posts.each do |post| %> 
 <h1><%=raw post["name"]%></h1> 
 <p><%=raw post["body"] %></p> 
 <p><%=raw post["timestamp"]%></p> 
<% end %> 

但是,如果您要存储用户创建的任意HTML,我建议您不要这样做,除非您在将输入存储到数据库之前清理输入。

编辑:

另一种选择:使用sanitize helper代替raw,例如<%=sanitize post["name"], :tags => "p" %>允许<p>代码。

答案 1 :(得分:2)

除了raw.html_safe,它们对用户的输入给予100%的信任,您还可以使用sanitize来限制许多允许的标记。

&lt;%= sanitize post [“name”] $&gt;

有关详细信息,请参阅:http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html