2012-01-26 10 views
1

私は、Railsに移行しようとしている古いブログ投稿でデータベースを詰め込んでいます。体のフィールドは、このような形式を持って見ての記事で構成されていますRails 3で安全なHTMLをレンダリングする

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. 

<iframe src="http://www.youtube.com?v=XXXXXXXX" width="400" height="250"></iframe> 

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. 

<ul> 
<li>List item</li> 
<li>List item</li> 
<li>List item</li> 
<li>List item</li> 
</ul> 

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. 

それでは、私がやろうとしていること<p>で段落テキストを折り返す、単独では他のHTML要素を残しています。ここで私が試したものです:

simple_format(@ post.body)を=これは、すべての周り<p>を置きますが、また、各リスト項目間の区切りと私の順不同リストを汚染します。また、iframe埋め込みは表示されません。

(@ post.body)またはpost.body.html_safe @ = iframeの埋め込みと順不同リストは偉大な表示が、新しい行のための置換はありませんので、すべてが一緒に実行されています。

simple_format(@ post.body、{}、{:sanitize => false}) =クールです。今、私はすべてのHTMLタグを見ることができます! post.body.gsub @すべて

で働く(/ \ Rの\ nは?/ "<br/>")simple_formatと同様に =同じ問題を.html_safeません...私は私の中に改行を取得していますHTMLブロック要素タグ。

これを達成するための提案はありますか?

+0

注意を望むものだと思います! unsanitized、untrusted文字列で 'html_safe'を呼び出すと*あなたはXSS攻撃を受けることになります。何かの上で 'html_safe'を呼び出す場合、その文字列に信頼できないユーザ入力が含まれていないことを絶対に確かめなければなりません。 – Ajedi32

答えて

2

私はあなたがほとんどあなたの最後の例ではそれを持っていたと思うが、私の推測では、あなたが.html_safe早く行う必要があるということです。

@post.body.html_safe.gsub(/\r\n?/,"<br/>") 
+0

gsubはそれを文字列に変換し、レンダリング時にすべてのhtmlが表示されるようにします。 – bjork24

+1

一見して、これは再び 'html_safe'にする必要があると思います。 '@ post.body.html_safe.gsub(/ \ r \ n?/、"
").html_safe'を試してください。 gsubの結果はデフォルトで消された文字列になります。 –

1

を私はあなたの質問が解決しようとするよりも、レールに行うことが少ないがあると思います壊れたhtml。いずれの場合でも、あなたの例では、<p>タグにラップする必要があるテキストは、タグで始まっていない行であることが示唆されています。このルールが他の投稿に適用されるかどうかはあなただけが知っています。

これを試してください。また、先頭の空白も考慮します。

raw(@post.body.gsub(/^\s*[^<].*/, '<p>\&</p>')) 

上記があまりにも脆い場合は、ノコギリを使用することをおすすめします。これは、テキストの各トップレベルの連続ブロックを取り、<p>でそれをラップします:

doc = Nokogiri.XML("<body>\n" + @post.body + "\n</body>\n") 
doc.root.children.each{|c| c.text? and c.replace("<p>#{c.to_s.strip}</p>") } 
raw(doc.root.inner_html) 

テキストブロック内改行で<br>秒を挿入するには、c.to_s.strip.gsub(/\r?\n/, "<br/>\n")して上記c.to_s.stripを置き換えることができます。

あなたの質問には/\r\n?/がありました。以前のMac OSのキャリッジリターン(\r)を自分で期待していますか? WindowsまたはUnixを処理したい場合は、/\r?\n/を使用してください。

1

私はsanitizeは多分あなたは

%= sanitize @article.body %> 


def sanitize(html, options = {}) 
    self.class.white_list_sanitizer.sanitize(html, options).try(:html_safe) 
end 
関連する問題