61

ユーザーが送信した HTML を (データベースに) 保存しています。JavaScript インジェクション攻撃を防ぐ必要があります。私が見た中で最も悪質なのは、style="expression(...)".

これに加えて、かなりの量の有効なユーザー コンテンツに特殊文字や XML 構成要素が含まれているため、可能であればホワイト リストのアプローチは避けたいと考えています。(許可されるすべての HTML 要素と属性をリストします)。

JavaScript 攻撃文字列の例:

1.

"Hello, I have a
<script>alert("bad!")</script>
problem with the <dog>
element..."
"Hi, this <b
style="width:expression(alert('bad!'))">dog</b>
is black."

そのような JavaScript を防ぎ、残りをそのままにしておく方法はありますか?

私がこれまでに持っている唯一の解決策は、正規表現を使用して特定のパターンを削除することです。ケース 1 は解決しますが、ケース 2 は解決しません。

環境は基本的に Microsoft スタックです。

  • SQL Server 2005
  • C# 3.5 (ASP.NET)
  • JavaScript と jQuery。

チョークポイントを ASP.NET レイヤーにしたいと考えています。誰でも不正な HTTP リクエストを作成できます。

編集

皆さん、リンクありがとうございます。リストを定義できると仮定すると (コンテンツには多くの数学およびプログラミング構造が含まれるため、ホワイトリストは非常に煩わしいものになります)、まだ質問があります。

「悪い」部分を削除できるのはどのような種類のパーサーですか? 悪い部分は要素全体である可能性がありますが、属性に存在するスクリプトはどうでしょうか? < a hrefs >willy-nillyを削除できません。

4

7 に答える 7

44

それだけだと思いますか?これをチェックしてください

どのようなアプローチを取るにしても、必ずホワイトリストを使用する必要があります。これは、サイトで許可しているものについて安全に近づく唯一の方法です.

編集

残念ながら、私は .NET に詳しくありませんが、stackoverflow 自身の XSS との戦い ( https://blog.stackoverflow.com/2008/06/safe-html-and-xss/ ) とそのコードを確認できます。このサイトに投稿された HTML を解析するように書かれています: Archive.org リンク- ホワイトリストが大きいため、明らかにこれを変更する必要があるかもしれませんが、開始する必要があります。

于 2009-06-02T21:35:40.360 に答える
8

私の意見では、要素と属性のホワイトリストが唯一の許容可能な選択肢です。ホワイトリストにないものはすべて取り除くか、エンコードする必要があります (<>&" をエンティティに変更します)。また、許可する属性内の値を必ず確認してください。

それ以下の場合、問題 (既知のエクスプロイトまたは将来発見されるエクスプロイト) に直面することになります。

于 2009-06-02T21:41:10.003 に答える
4

本当に安全な唯一の方法は、ホワイトリストを使用することです。すべてをエンコードしてから、許可されたコードを元に戻します。

危険なコードのみを禁止するかなり高度な試みを見てきましたが、それでもうまくいきません。誰もが考えることができるすべてのものを安全にキャッチしようとするのはかなりの偉業であり、まったく危険ではないいくつかのものの厄介な置き換えを行う傾向があります.

于 2009-06-02T21:50:13.543 に答える
4

現在、最善のオプションは、次のようなコンテンツ セキュリティ ポリシーヘッダーを使用することです。

Content-Security-Policy: default-src 'self';

これにより、インラインと外部の両方のスクリプト、スタイル、画像などの読み込みが防止されるため、同じオリジンからのリソースのみがブラウザーによって読み込まれ、実行されます。

ただし、古いブラウザでは動作しません。

于 2017-09-13T12:13:13.000 に答える
3

基本的に、パオロが言ったように、ユーザーがすべきでないことを除外しようとするのではなく、ユーザーができることに集中するようにすべきです。

許可された HTML タグ (b、i、u など) のリストを保持し、その他すべてを除外します。おそらく、許可された HTML タグのすべての属性を削除したいでしょう (たとえば、2 番目の例のため)。

別の解決策は、多くのフォーラムで使用されている、いわゆる BB コードを導入することです。構文は HTML に似ていますが、許可されたコードのホワイトリストのアイデアから始まり、それが HTML に変換されます。たとえば、 [b]example[/b] はexampleになります。BB コードを使用して HTML タグを除外する場合は、事前に確認してください。

于 2009-06-02T21:45:11.650 に答える
0

どのサーバー側コードを使用していますか? 悪意のあるスクリプトを除外する方法はいくつかありますが、これは危険な領域です。ベテランの専門家でさえ捕まります: http://www.codinghorror.com/blog/archives/001167.html

于 2009-06-02T21:41:52.467 に答える