Rails アプリの XSS 脆弱性を防ぐために HTML をエスケープする推奨される方法は何ですか?
ユーザーがデータベースに任意のテキストを入力できるようにする必要がありますが、表示するときにエスケープする必要がありますか? 入力をエスケープするために before_save フィルターを追加する必要がありますか?
Rails アプリの XSS 脆弱性を防ぐために HTML をエスケープする推奨される方法は何ですか?
ユーザーがデータベースに任意のテキストを入力できるようにする必要がありますが、表示するときにエスケープする必要がありますか? 入力をエスケープするために before_save フィルターを追加する必要がありますか?
この問題には3つの基本的なアプローチがあります。
h()
します。ここでの欠点は、忘れるとpwndが発生することです。h()
そうすれば、ビューで使用する必要はありません(ほとんどの場合)。コントローラレベルで動作する他のものがあります。ここでの欠点は次のとおりです。(a)エスケープコードにバグがある場合、データベースにXSSが含まれる可能性があります。(b)まだ使用したい場合がありますh()
。次に、いくつかのハイブリッドアプローチがあります。
xss_terminateとCrossSiteSniperを同時に使用できない理由はありません。
Erubisと呼ばれるERb実装もあります。これは、のような呼び出し<%= foo.name %>
がエスケープされるように構成できます。これは、と同等です<%= h(foo.name) %>
。残念ながら、Erubisは常にRailsに遅れをとっているように見えるため、Erubisを使用すると速度が低下する可能性があります。
詳細をお読みになりたい場合は、xss_terminateの使用に関するブログ投稿(Xavorが親切にリンクしています)を作成しました。
hは、すべての HTML タグ文字をエスケープするためのユーティリティ メソッドであるhtml_escapeのエイリアスです。
html_escape('<script src=http://ha.ckers.org/xss.js></script>')
# => <script src=http://ha.ckers.org/xss.js></script>
さらに制御が必要な場合は、sanitizeメソッドを使用します。これは、許可するタグと属性のホワイトリストとして使用できます。
sanitize(@article.body, :tags => %w(table tr td), :attributes => %w(id class style))
ユーザーが何かを入力し、データベースにそのまま保存し、表示するときにエスケープできるようにします。そうすれば、入力した情報が失われることはありません。後でいつでもエスケープロジックを微調整できます...
ビュー テンプレートで h メソッドを使用します。コメント プロパティを持つ投稿オブジェクトがあるとします。
<div class="comment">
<%= h post.comment %>
</div>
またはこのプラグインを使用する場合-h8)は必要ありません
http://railspikes.com/2008/1/28/auto-escaping-html-with-rails
Sanitize gemを使用してActsAsSanitiledというプラグインをリリースしました。これにより、ユーザー入力を変更したり、テンプレートレベルで何かを覚えたりすることなく、整形式であり、許可されるHTMLの種類に合わせて非常に構成可能であることが保証されます。