Rails – h()を使ったHTMLのエスケープと特定のタグの除外

escaping html ruby-on-rails security

私は疑問に思っていた、そして今のところ、どんな答えもオンラインで見つけることができなかった、次のことを達成する方法。

以下を含む文字列があるとしましょう。

my_string = “こんにちは、私は_string_です。” (プレビューウィンドウでは、これは実際には “strong”タグと “i”タグを表示するのではなく、BOLDとITALICでフォーマットされていることがわかります)

それでは、html_escape()(またはh())メソッド/関数を使用して、これを安全にしたいと思います。 だから私はユーザーがどんなJavaScriptやスタイルシートも挿入するのを防ぎたいのですが、私はまだ太字で表示されている単語と “イタリック”で表示されている文字列を持っていたいです。

私の知る限りでは、h()メソッドはテキスト自体を除いて、追加の引数を取りません。

全部ではなく、特定のHTMLタグのみをエスケープする方法はありますか? ホワイトリストタグとブラックリストタグのどちらが好きですか。

これがどのように見えるか、私が言おうとしていることの例は次のようになります。

h(my_string、:except ⇒ [:strong、:i])#⇒基本的にはすべてをエスケープするが、 “strong”と “i”タグだけを残してこれらをエスケープしないでください。

これを達成するための方法や方法はありますか?

前もって感謝します!

  5  2


ベストアンサー

特定のタグを除外することは実際にはかなり難しい問題です。 特に `script`タグは いろいろな方法で挿入することができます – それらすべてを検出するのはとてもトリッキーです。

可能であれば、これを自分で実装しないでください。

3


実際にHTMLを許可する代わりに RedClothまたはhttp://www.deveiate.org/projects/BlueCloth[BlueCloth]を使用することを検討しましたか これらのメソッドはかなりのフォーマットオプションを提供し、解析を管理します。

編集1: RedClothを使用してHTMLを削除する方法をブラウズするときに、 このメッセージを見つけました。 また、 このページには、バージョン2.0.5でHTMLを削除する方法が記載されています。 最新の情報は見つかりませんでしたが、 フォーラムの投稿に脆弱性が見つかりました。 うまくいけば、2006年から修正されていますが、RedClothのマニュアルやマニュアルが見つからないようです…

2


http://agilewebdevelopment.com/plugins/whitelist[white list]プラグインまたは http://agilewebdevelopment.com/plugins/whitelist[変更]バージョンを使用してください。 すごい! あなたは一見 http://github.com/rgrove/sanitize/[Sanitize]を持つこともできます(より良いように見えますが、それを試したことがない)。

2


次に、HTMLタグを削除してサニタイズします。 それは本当にうまくいきます。 デフォルトですべてが削除され、許可したいタグのホワイトリストを指定できます。

1


XSS攻撃を防止することは深刻なビジネスであり、時間の経過に従って、ブラウザの曖昧さが原因で可能性のあるものよりも桁違いに悪用される可能性があると考えています。 html_escapeは物事をきつく締め付けますが、このタイプのものに自家製のものを使用するのは誤りだと思います。 どんな種類の堅牢性を保証するにも、単にもっと多くの眼球とピアレビューが必要です。

現時点では sanitizeとhttp://github.com/look/xss_terminate[XssTerminate]の評価を進めています。 堅牢性のためにxss_terminateアプローチをお勧めします。モデルレベルでのスクラブは、すべてのユーザー入力がActiveRecordを介して行われる通常のRailsアプリケーションでは非常に信頼性が高くなりますが。 ://loofah.rubyforge.org/loofah/ [Loofah]はもう少し性能が向上し、より積極的に保守され、そして間違いなくもっと柔軟でRubyっぽいようです。

_Update_私はちょうど Santize(最近nokogiriを使うように更新された)を使うhttp://github.com/dasil003/acts_as_sanitiled[ActsAsSanitiled]と呼ばれるActsAsTextiledのフォークを実装しました。ところで、RedClothの出力の安全性と整形式性を保証するために、テンプレートにヘルパーは必要ありません。

0


タイトルとURLをコピーしました