2011-07-10 28 views
6

私はjavascriptとxss攻撃のために私のWebサイトをxss-proofingしています。これは、ASP.NET Webformsで書かれています。JavascriptとXSS攻撃の防止

私がテストしたい主な部分は、テキストボックス(tinyMCEが付いている)を持つユーザーコントロールです。

ユーザーは、このテキストボックスに記事を投稿することで、記事をサイトに送信できます。 validateRequestをfalseに設定しなければならなかったので、私はHMTL(tinyMCE)でユーザーの話を聞きたいのです。

javascript-xss攻撃を防止するにはどうすればよいですか?ユーザーのストーリーはHMTLのテキストなので、自分の話にはServer.HtmlEncodeを使用できません。一般的に、ユーザーからHTMLコンテンツを受け取り、保存してユーザーに表示する安全な方法は何ですか?

1人のユーザーがテキストボックスに悪意のあるコードを入れて送信した場合、そのテキストを閲覧する他の人に害を及ぼす可能性はありますか?
ありがとうございます。

+2

良い質問には、防御する必要があるさまざまな種類の攻撃のうちのhttp://ha.ckers.org/xss.htmlがあります。私は1つの答えが質問の正当化を行うとは思わない。あなたのキャプチャは時代遅れです(2年以上前に更新されました)。 googleの[recaptcha](http://www.google.com/recaptcha)をお試しください。 – naveen

+0

SQLインジェクション攻撃を防ぐことも害ではありません。 – Tim

+1

@Tim:EFで世話をした – Kamyar

答えて

4

ユーザーがテキストボックスに入れたものをクリーンアップせずに提出すると、「はい」と表示されることがあります。

Microsoft Anti-Cross Site Scripting Libraryは、開発者がこのような攻撃を防ぐのに役立つように設計されています。

も見てみる価値はOWASPのCross-site Scripting (XSS)

あなたにもHttpUtility.HtmlEncodeとHttpUtility.HtmlDecodeに見たいと思うかもしれませんです。私は簡単なテストを書いて、それが(適切なフォーマットで他のユーザーにデータを表示する方法について)以下のコメントで、あなたの懸念に対処可能性があるように見えます:

string htmlString = "<b>This is a test string</b><script>alert(\"alert!\")</script> and some other text with markup <ol><li>1234235</li></ol>"; 

string encodedString = HttpUtility.HtmlEncode(htmlString); 
// result = &lt;b&gt;This is a test string&lt;/b&gt;&lt;script&gt;alert(&quot;alert!&quot;)&lt;/script&gt; and some other text with markup &lt;ol&gt;&lt;li&gt;1234235&lt;/li&gt;&lt;/ol&gt; 

string decodedString = HttpUtility.HtmlDecode(encodedString); 
// result = <b>This is a test string</b><script>alert("alert!")</script> and some other text with markup <ol><li>1234235</li></ol> 

ASP.NETコントロールとHTMLEncode 私はクラスから得た情報を投稿するつもりでしたが、(1.1と2.0の)全く同じものをリストしたリンクを見つけましたので、わかりやすくするためにリンクを投稿します。おそらくMSDNを見て、リストされていない特定のコントロール(または変更した場合は3.0/3.5/4.0バージョン)に関する詳細情報を得ることができますが、少なくともこれはクイックスタートガイドとして役立ちます。もっと情報が必要な場合は私に教えてください。

ASP.NET Controls Default HTML Encoding

ここでMSDNのブログの1からのより包括的なリストです:Which ASP.NET Controls Automatically Encodes?

+0

ありがとうございます。しかし、どのようにすれば、データを他のユーザーに適切な形式で表示できますか?実際には、validateRequestをfalseに設定すると少し気になりました! – Kamyar

+3

validateRequestをページのfalseに設定する必要があります。他の検証をしていない場合は心配ありません。.NETで使用できるエンコード/デコードメソッドを調べる必要があります。私はそれを行う方法があることを99%確信していますが、私はいくつかのドキュメントをチェックしなければならず、彼らは仕事中です。 – Tim

+0

ありがとうございます。あなたがあなたの文書を見る時間があればいつでもあなたの答えを更新すれば、私はとても喜んでいます。 – Kamyar

3

私はその後、表示するときは、それをデコードした場合&lt;でのみ<を置き換え、それはデータベースでエンコード保管して行くだろうあなたは他のものを保存する必要があると言います。

私の知る限りでは、あなたが交換する場合は任意のJSコードを実行する<script>タグ内でなければならないと交換することにより、あなたはHTMLソースでこれを買ってあげるよう< XSSは本当に不可能です: &lt;script>とブラウザは&lt;エンティティを解析するため、画面には<script>が表示されます。

これは、ユーザーが「生の」HTMLを投稿できるようにした場合です。

string[] allowedTags = new string[] { "a", "b", "img" }; 
foreach (allowedTag in allowedTags) 
    output = output.Replace("&lt;" + allowedTag, "<" + allowedTag); 
+1

Hmm。共鳴する音。すべての<タグを置き換えた後、許可されたタグに対してこれを逆にする... – Kamyar

+0

&#0060と&#000000000000000060も動作します。 –

+0

@Mark '&#0060'は' < 'と同じです。デコードされるまで無害ですので、ホワイトリストの方法は、私が知る限り安全です。 –

1

はあなたがOWASP guide on this

最善の方法を持っているだろう見たことがあります:<b>this section is bolded</b>は、あなたがして、手動で例えば適切なHTMLと&lt;を置き換える許さタグの「ホワイトリスト」を作成する必要がありますすべてのスクリプトタグを防ぐ方法を考えようとするのではなく、許可されたタグのホワイトリスト。

これを行う方法の1つの解決方法はここにありますHow do I filter all HTML tags except a certain whitelist? しかし、自分のサーバーへのURLを持つ画像タグを介して外部スクリプトへのリンクがあるかもしれないことに気づく必要があります。ここにある例を参照してください。

関連する問題