我在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>
在我的数据库中,标记将被渲染,而不是被打印。
答案 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