5

ASP.Net C#+ jQueryajaxWebサイトプロジェクトに取り組んでいます。私はxss攻撃を防ごうとしていますが、以下は完全なアプローチではないことを知っていますが、これは少なくとも私がすべきことです-ユーザーからの無料の文字列入力を受け入れるときにHtmlEncodeを使用するため)。そして、私は本当に私が正しいことをしているのかどうかを親切にチェックしてくれる人です。

たとえば、ページコントロールの1つが「説明」テキストボックスであり、ユーザーが製品の説明に使用される「無料」の文字列を入力できるシナリオがあるとします。xssが入力を攻撃するのを防ぐために、サーバー側のページメソッドで、を使用して「説明」テキストをラップしました。HtmlUtility.HtmlEncode()これにより、文字列はデータベースに入る前に純粋なテキストとして解釈されます。つまり、<script>になり&gt;script&lt;ます。

次の部分は私が疑っているものです-それをユーザーに返す前にhtmlでエンコードされたテキストを処理する方法は?

ユーザーが入力された説明テキストを表示したい場合、データベースから取得されたWebサイトがそれを印刷します。

ユーザーがそれらの奇妙な文字を見ないように、説明に対してhtmlデコードを実行することは論理的&gt;&lt;ですか?そもそもHtmlEncodeを使用する目的を無効にするのでしょうか。はいの場合、これはテキストをデコードしてユーザーに出力するための正しいjQuery行ですか?

$("#txtDescription").val($(this).html(obj.Description).text();

本当にありがとう

4

3 に答える 3

6

データベースに入るテキストをエンコードしないでください。未加工のフィルタリングされていない形式で保存します。文字列がHTML対応のコンテキスト(ブラウザへの出力など)に出力される場合にのみ、HTML文字をエンコードします。

于 2013-02-08T06:25:50.617 に答える
1

扱う各文字列のコンテンツタイプと、それがどこから来たのかを覚えておく必要があります。安全なソースか信頼できないソースかを確認し、2つの文字列を連結するときに、両方が同じコンテンツタイプで信頼できる文字列であることも知っておく必要があります。 -レベル。

を使用して「説明」テキストをラップしたHtmlUtility.HtmlEncode()ので、文字列はデータベースに入る前に純粋なテキストとして解釈されます。つまり、<script>になり&gt;script&lt;ます。

ここでは、説明フィールドはプレーンテキストの文字列であり、データベースに格納しているのは安全なHTMLの文字列であると言っているように聞こえます(HtmlEncodeの出力には危険なコードが含まれないことが保証されているため)。

これは、コンテンツのエンコードが時期尚早であるという最初の問題を示しています。サーバーに送信するSQL文字列を作成している場合、HTMLとして事前にエンコードしても、SQLインジェクションから保護されません。SQLプリペアドステートメントを使用することは、SQLでこれを克服するための良い方法ですが、事前エンコードは、すべてのコンテキストで文字列を安全にするわけではありません。

次の部分は私が疑っているものです-それをユーザーに返す前にhtmlでエンコードされたテキストを処理する方法は?

ユーザーが入力された説明テキストを表示したい場合、データベースから取得されたWebサイトがそれを印刷します。

ユーザーが安全なHTMLを受信して​​いて、安全なHTMLの文字列がある場合は、それをユーザーに送信できます。

ユーザーがプレーンテキストの電子メールを受信して​​いる場合は、データベースに保存されている安全なHTMLをプレーンテキストに変換する必要があります。

ユーザーがRSSを受信して​​いる場合は、XMLのサブストリングを使用してRSSを作成する必要があります。

コンテキスト自動エスケープは、値が出力で適切にエンコードされていることを確認するのに役立ちます。

于 2013-02-10T23:49:04.110 に答える
0

httputility.htmlencodeの代わりにAntiXssライブラリを使用することをお勧めします。より明確にするために、ドキュメントを読むことを検討してください。入力エンコーディングを使用したAntiXSSライブラリには幅広いオプションがあります。この説明で説明したように、より安全なホワイトリストベースのアプローチに従います。

于 2013-02-12T03:17:43.233 に答える