RailsでHTMLをエスケープする質問する

RailsでHTMLをエスケープする質問する

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

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

ベストアンサー1

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

  1. ビューで使用しますh()。ここでの欠点は、忘れると pwnd されることです。
  2. 保存時にコンテンツをエスケープするプラグインを使用します。私のプラグインxss_終了はこれを行います。その後、ビューで を使用する必要はありませんh()(ほとんどの場合)。コントローラー レベルで機能する他の もあります。ここでの欠点は、(a) エスケープ コードにバグがある場合、データベースで XSS が発生する可能性があること、および (b) 依然として を使用したいコーナー ケースがあることですh()
  3. コンテンツを表示するときにエスケープするプラグインを使用します。クロスサイトスナイパーおそらく、これらの中で最もよく知られているプラ​​グインです。これは属性をエイリアス化して、foo.name を呼び出すときにコンテンツをエスケープします。コンテンツをエスケープ解除する必要がある場合は、回避策があります。私はこのプラグインが好きですが、そもそもデータベースに XSS を侵入させることには乗り気ではありません...

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

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

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

もっと詳しく知りたい方は、私が書いたブログ記事(Xavorさんが親切にリンクしてくれました)をご覧ください。xss_terminateを使用する

おすすめ記事