3

我在 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>

在我的数据库中,标签将被呈现,而不是被打印。

4

2 回答 2

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助手代替raw,例如<%=sanitize post["name"], :tags => "p" %>允许<p>标签。

于 2010-12-15T13:22:05.823 回答
2

除了100% 信任用户的输入之外raw.html_safe您还可以使用它sanitize来限制仅允许的标签数量。

<%= 清理帖子["name"] $>

详情见:http ://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

于 2010-12-15T13:53:53.767 回答