web-dev-qa-db-ja.com

リッチテキストエディター出力のエスケープ

  • Webアプリケーションでリッチテキストエディターを使用している場合、HTMLエンティティをエスケープしてXSS攻撃を防ぎ、フォーマットを維持するための最良の方法は何ですか(<b><i><u>、...など)?
8
Awake Zoldiek

Content-Security Policy or CSP を使用すると、JavaScriptを実行しない、したがってXSSを実行しない、ユーザー制御のHTMLのページを作成できます。

これはブラウザにJavaScriptを実行しないように指示しています。これは出力をフィルタリングするよりもはるかに強力であり、両方を使用するとセキュリティが向上します。 HTMLPurifer 、antisammy、 safehtml などのHTMLフィルタリングライブラリにはすべて多数のバイパスがあり、防御手段としてのみ使用するべきではありません。これらは非常に複雑なフィルターであり、複雑さはセキュリティの最悪の敵です

12
rook

この場合の最も重要なことはセキュリティです。私たちはユーザーから、またはおそらく自分でHTMLテキストを与え、それを試験のためにDBに保存し、それを取得して、あらゆる種類の攻撃を恐れずに、悪意のあるユーザーによって誤用されることなくWebページに表示したいと考えています。私はそれを約4日間行う最良の方法について調査され、2つの基本的な方法を見つけました。 Webアプリ開発の多くのIDEには、脆弱性に対する最初の溝であるHTMLの投稿を防止または警告するためのいくつかの基本的なルールがあるという他の重要なことについてお話させてください。これに合格する方法は2つあります。

1)HTMLをエンコードして投稿するIDEはHTMLタグを見つけることができず、データの投稿を許可するため、保存して毎回取得し、デコードして使用することができます。準備されたクラスと拡張機能、または独自の記述以下のリンクは、.Net環境またはjs/jQueryでのいくつかの例です。

https://stackoverflow.com/questions/524528/asp-net-mvc-html-encode-new-lines

https://stackoverflow.com/questions/122641/how-can-i-decode-html-characters-in-c

https://stackoverflow.com/questions/1219860/html-encoding-in-javascript-jquery

そしてこれはいくつかのjs/jQuery関数がそれを行うことができることについての私自身のテストです: http://jsfiddle.net/QMaster/4gz7yqcq/

2)1つのページまたはアプリ全体から検証をオフにします。以下のリンクは.Netについてです: http://msdn.Microsoft.com/en-us/library/hh882339(v = vs.110).aspx

ただし、AllowHTML属性を使用することをお勧めします: http://msdn.Microsoft.com/en-us/library/system.web.mvc.allowhtmlattribute(v = vs.118).aspx

そして私の答えを読むことができます: https://stackoverflow.com/questions/4759681/post-html-tag-codes-as-string-with-asp-net-mvc-jquery/25233054#25233054

まず、HTMLをエンコードして投稿し、保存してからデコードするのが最善の方法だと思っていました。私の答えの中でも特に2番目の方法でわかるのですが、HTMLタグのフィルタリングと表示に関するルールを変更するとどうなるかを考えます。与えられたHTMLでエンコーディングが何かを失ったかどうかはわかりません。ただhtmlを保存する必要があることと、危険の最も重要なセクションがそれを取り戻し、応答に書き込むときであることを除いて、[AllowHTML]属性によって特別なフィールドに対してのみHTMLの投稿を許可することを決定しました。したがって、ユーザーの書き込みとしてHTMLを取得し(多くのHTMLエディターと同じようにタグにいくつかの制限を加えることができます)、DBに保存します。これでHTMLができたので、それを取得してページに表示する必要があります。これは攻撃者が来る場所です。 HTMLのスクリプトは実行でき、フレームはロードできます。 HTMLをサニタイズする必要があります。つまり、危険な部分からHTMLをクリアします。 1)準備済みのツールを次のように使用できます。

https://Gist.github.com/ntulip/814428http://wpl.codeplex.com/https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer

または2)HTMLパーサーを使用して、ブラックリストまたはホワイトリストで危険であると示唆されたすべての要素を削除します。一部のHTMLパーサーには、検索して比較できる短所と長所があります。 http://htmlagilitypack.codeplex.com/ でHtml Agility Packに達し、 https://github.com/jamietre/csquery でCsQueryに達したか、または-で支払われたawesomium http://www.awesomium.com/

html Agility Pack VS CsQueryの比較は http://blog.outsharked.com/2012/06/csquery-performance-vs-fizzler.html にあります

結局私はこの素晴らしい記事を読んで http://weblog.west-wind.com/posts/2012/Jul/19/NET-HTML-Sanitation-for-rich-HTML-Input と決めましたHTMLを解析し、自分の関数でサニタイズします。今のところ私はHAPを使用していますが、そのパフォーマンスのためにCsQueryをできるだけ早く使用する予定です。

この助けを願っています。

0
QMaster