8

HTMLをサーバーに渡すリッチテキストエディターがあります。そのHTMLは他のユーザーに表示されます。そのHTMLにJavaScriptが含まれていないことを確認したいと思います。これを行う方法はありますか?

また、それが役立つ場合は、ASP.NETを使用しています。

4

6 に答える 6

11

一部の HTML マークアップに JavaScript が含まれていないことを確認する唯一の方法は、クロスサイト スクリプティング(XSS)を防ぐために、すべての安全でない HTML タグと属性をフィルター処理することです。

ただし、一般に、すべての安全でない要素と属性を名前で明示的に削除する確実な方法はありません。設計時に認識していなかったものを特定のブラウザが解釈し、悪意のある要素や属性に対してセキュリティ ホールを開く可能性があるためです。ユーザー。これが、ブラックリストに登録するよりもホワイトリストに登録する方がはるかに優れている理由です。つまり、安全であると確信している HTML タグのみを許可し、デフォルトで他のすべてを削除します。実際、誤って許可されたタグが 1 つあるだけで、Web サイトが XSS に対して脆弱になる可能性があります。


ホワイトリスト (良いアプローチ)

HTML サニタイズに関するこの記事を参照してください。ブラックリストではなくホワイトリストに登録する必要がある理由の具体例がいくつか示されています。そのページからの引用:

以下は、潜在的に危険な HTML タグと属性の不完全なリストです。

  • script、悪意のあるスクリプトを含む可能性があります
  • appletembed、およびobject、悪意のあるコードを自動的にダウンロードして実行できる
  • meta、悪意のあるリダイレクトを含む可能性があります
  • onload、 、および悪意のあるスクリプトを含む可能性のあるonunloadその他すべての属性on*
  • stylelink、およびstyle属性。悪意のあるスクリプトが含まれる可能性があります。

これは、HTML タグと属性のセット、および通常は許可しても安全な CSS 属性と、推奨されるプラクティスを提案する別の役立つページです

ブラックリスト (一般的に悪いアプローチ)

多くの Web サイトが過去 (および現在) にブラックリスト アプローチを使用していますが、それが実際に必要になることはほとんどありません。(セキュリティ リスクは常に、ホワイトリストがユーザーに許可されている書式設定機能で強制する潜在的な制限を上回ります。) その欠陥を十分に認識する必要があります。

たとえば、このページには、削除する可能性のある「すべて」の HTML タグのリストが示されています。簡単に観察すると、非常に限られた数の要素名が含まれていることに気付くはずです。ブラウザには、無意識のうちにページでのスクリプトの実行を許可する独自のタグが簡単に含まれる可能性があります。これが本質的にブラックリストの主な問題です。


最後に、 .NET にはHTML DOM ライブラリ(よく知られたHTML Agility Packなど) を使用することを強くお勧めします。これは、RegEx を使用してクリーンアップ/ホワイトリストを実行するのではなく、はるかに信頼性が高いためです。(正規表現をだますことができる、非常にクレイジーな難読化された HTML を作成することは十分に可能です! とにかく、適切な HTML リーダー/ライターを使用すると、システムのコーディングがはるかに簡単になります。)

XSS を完全に (または少なくとも最大限に) 防ぐために何を設計する必要があるか、未知の要因を念頭に置いて HTML サニタイズを実行することがいかに重要であるかについて、適切な概要が得られることを願っています。

于 2009-05-13T16:04:19.557 に答える
4

Lee Theobald が指摘したように、これは非常に危険な計画です。定義上、フィルタリング/ブラックリスト化によって「安全な」HTML を作成することはできません。これは、ユーザーが考えもしなかったもの (または、ブラウザーのバージョンには存在しないが他のバージョンには存在するもの) を HTML に入れる可能性があるためです。

唯一の安全な方法は、ホワイトリスト アプローチです。つまり、プレーン テキストと特定の特定の HTML 構成要素以外はすべて削除します。ちなみに、これはstackoverflow.comが行うことです:-)。

于 2009-05-13T16:06:31.923 に答える
3

ホワイトリストアプローチ(JavascriptおよびPythonコード)を使用してそれを行う方法は次のとおりです

https://github.com/dcollien/FilterHTML

許可された HTML のサブセットの仕様を定義します。それは、このフィルターを通過する必要があるものだけです。特定のスキーム (http:、ftp: など) のみを許可し、XSS/Javascript の問題を引き起こすスキーム (javascript: や data: など) を許可しないことで、URL 属性を浄化するオプションもいくつかあります。

編集: これは、すべての状況ですぐに使用できる 100% の安全性を提供するわけではありませんが、他のいくつかのトリック (URL が同じドメインにあるかどうか、正しいコンテンツ タイプ、など)それはあなたが必要とするものかもしれません

于 2012-11-03T07:43:25.253 に答える
2

ユーザーが HTML コード自体を表示できるように html を変更する場合。すべての「<」、「>」、「&」、および「;」を文字列置換します。たとえば、'<' は '<' になります。

HTML を機能させたい場合、最も簡単な方法は、すべての HTML と Javascript を削除してから、HTML のみを置き換えることです。残念ながら、JavaScript をすべて削除して HTML のみを許可する確実な方法はほとんどありません。

たとえば、画像を許可したい場合があります。しかし、あなたは自分ができることを知らないかもしれません

<img src='evilscript.js'>

そしてそのスクリプトを実行できます。非常に危険な状態になり、非常に高速になります。これが、ウィキペディアやこのウェブサイトなどのほとんどのウェブサイトが特別なマークダウン言語を使用する理由です。これにより、悪意のある JavaScript ではなく、書式設定を許可することがはるかに簡単になります。

于 2009-05-13T16:04:13.207 に答える
-1

TinyMCEなどの一部のブラウザー ベースの WYSIWYG エディターがどのように機能するかを確認することをお勧めします。彼らは通常 JS を削除し、適切な仕事をしているようです。

于 2009-05-13T16:02:51.260 に答える
-2

最も簡単な方法は、正規表現を使用してタグを削除することです。問題は、スクリプトタグなしで多くの厄介なことを実行できることです(たとえば、危険な画像を埋め込んだり、厄介なJavascriptを持っている他のサイトへのリンクを持ったりします)。小文字/大文字をHTMLエンティティ形式(<など)に変換してHTMLを完全に無効にすることもできます。

より強力なソリューションが必要な場合は、過去にAntiSamyを使用して受信テキストをサニタイズし、安全に表示できるようにしました。

于 2009-05-13T15:58:23.467 に答える