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_safesanitize

<%= post["name"] $> をサニタイズする

詳細については、http: //api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.htmlを参照してください。

于 2010-12-15T13:53:53.767 に答える