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_escape のエイリアスであり、すべてのHTMLタグ文字をエスケープするためのユーティリティメソッドです。
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>
またはこのプラグインを使用する-hの必要はありません8)
http://railspikes.com/2008/1/28/auto-escaping-html-with-Rails
ActsAsSanitiled というプラグインをリリースしました Sanitize gemを使用して、整形式を保証し、許可されるHTMLの種類に合わせて非常に構成可能で、すべてユーザーを混乱させることはありませんテンプレートレベルで何かを入力するか、覚えておく必要があります。