web-dev-qa-db-ja.com

Rails)でのHTMLのエスケープ

RailsアプリでXSSの脆弱性を防ぐためにHTMLをエスケープするための推奨される方法は何ですか?

ユーザーが任意のテキストをデータベースに入れることを許可し、それを表示するときにそれをエスケープする必要がありますか?入力をエスケープするためにbefore_saveフィルターを追加する必要がありますか?

25
Readonly

この問題には3つの基本的なアプローチがあります。

  1. ビューでh()を使用します。ここでの欠点は、忘れるとpwndになることです。
  2. 保存時にコンテンツをエスケープするプラグインを使用します。私のプラグイン xss_terminate これを行います。そうすれば、ビューでh()を使用する必要はありません(ほとんどの場合)。コントローラレベルで動作する他のものがあります。ここでの欠点は次のとおりです。(a)エスケープコードにバグがある場合、データベースにXSSが含まれる可能性があります。 (b)h()を使用したい場合があります。
  3. 表示時にコンテンツをエスケープするプラグインを使用します。 CrossSiteSniper はおそらくこれらの中で最もよく知られています。これにより属性がエイリアス化され、foo.nameを呼び出すとコンテンツがエスケープされます。コンテンツをエスケープ解除する必要がある場合は、それを回避する方法があります。私はこのプラグインが好きですが、そもそもXSSをデータベースに入れることに夢中ではありません...

次に、いくつかのハイブリッドアプローチがあります。

Xss_terminateとCrossSiteSniperを同時に使用できない理由はありません。

Erubis と呼ばれるERb実装もあります。これは、_<%= foo.name %>_などの呼び出しがエスケープされるように構成できます-<%= h(foo.name) %>と同等です。残念ながら、Erubisは常にRailsに遅れをとっているようです。そのため、Erubisを使用すると速度が低下する可能性があります。

もっと読みたい場合は、 xss_terminateを使用 についてのブログ投稿(Xavorが親切にリンクしている)を書きました。

22
Luke Francl

hhtml_escape のエイリアスであり、すべてのHTMLタグ文字をエスケープするためのユーティリティメソッドです。

html_escape('<script src=http://ha.ckers.org/xss.js></script>')
# => &lt;script src=http://ha.ckers.org/xss.js&gt;&lt;/script&gt;

さらに制御が必要な場合は、 sanitize メソッドを使用してください。これは、次のことを可能にするタグと属性のホワイトリストとして使用できます。

sanitize(@article.body, :tags => %w(table tr td), :attributes => %w(id class style))

ユーザーが何でも入力し、そのままデータベースに保存し、表示するときにエスケープできるようにします。そうすれば、入力した情報を失うことはありません。後でいつでもエスケープロジックを微調整できます...

14

ビューテンプレートでhメソッドを使用します。コメントプロパティを持つ投稿オブジェクトがあるとします。

<div class="comment">
    <%= h post.comment %>
</div>
5
Jason Punyon

またはこのプラグインを使用する-hの必要はありません8)

http://railspikes.com/2008/1/28/auto-escaping-html-with-Rails

2
Reuben Mallaby

ActsAsSanitiled というプラグインをリリースしました Sanitize gemを使用して、整形式を保証し、許可されるHTMLの種類に合わせて非常に構成可能で、すべてユーザーを混乱させることはありませんテンプレートレベルで何かを入力するか、覚えておく必要があります。

0
gtd