25

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

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

4

5 に答える 5

24

この問題には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が親切にリンクしています)を作成しました。

于 2009-03-31T16:16:24.503 に答える
14

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

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))

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

于 2009-03-30T23:09:36.607 に答える
5

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

<div class="comment">
    <%= h post.comment %>
</div>
于 2009-03-30T19:41:37.717 に答える
2

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

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

于 2009-03-30T20:18:03.463 に答える
0

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

于 2009-10-15T07:24:13.913 に答える