2016-06-22 5 views
0

私はAngularJSフロントエンドを持つ.NETバックエンドを持っています。 それはすべての作品は、ユーザがデータをJSONとして、私のバックエンドのエンコードされていないために、私は、データベースに入力したテキストを保存、送信されJsonをバックエンドからAngularJsにエンコードする必要がありますか?

<script>alert('xss');</script> 

として彼の名前を入力したときに(何のJavaScriptが実行されていない)、およびテキストを送信しますJsonのように、データが読み込まれるときにフロントエンドにコード化されて戻されません。

このようにすべて動作しますが、セキュリティプロセスを見て、Jsonをエンコードするようにアドバイスしました。

私の場合、私はJsonをより良くエンコードすべきですか?保存と読み込み時に

これは、JSONの一部です:

,"aanvragernaam":"<script>alert('xss');</script>"," 
+0

これはjavascript injectionです。ドキュメント( 'document.write')に書き込むことができない限り、あなたはOKです** **とにかくJSONの使用を強くお勧めします。 –

+0

OK、私は本当に明確に指定していません、私は既にJsonを使用しています(それを指定するために質問を編集しました) – Michel

+0

実際にデータをサーバーに投稿する前に入力を消毒することができます。 –

答えて

1

コンテンツタイプをapplication/jsonに設定している場合は、「既知」ではないため、this content type will not be sniffed by browsersです。したがって、これはXSSに対して安全でなければなりません。

さらにエンコードする必要はありません。

JSON Hijackingは、GET要求の別の脆弱性ですが、not an issue in modern browsersです。

私が見る他の唯一のリスクはDOM XSSです。 DOMに「現状のまま」の価値を書いていない限り、XSSのリスクはありません。もしあなたがそうであれば、それをHTMLでエンコードするか、JQueryやJavaScriptを使って適切にtext/textContentを設定し、ブラウザがそれをスクリプトとして解釈しないようにする必要があります。

ここでのリスクは<script>alert('xss')</script>ではないことに注意してください。ドキュメントに動的に追加されたときに実行するには<img src=x onload="alert('xss');" />のようにする必要があります。

0

データベースに名前を保存するためにバックエンドに要求を送信する前に、私はあなたがすべきencodeURI(名前)だと思います。

また、バックエンドからデータを受け取ったときにdecodeURI関数を使用します。

+0

これは何を解決するでしょうか? – Michel

1

ほとんどの場合、入力検証や括弧は拒否したいと思うかもしれません。しかし、それは他のタイプのデータ(コメントなど)をサポートしたいと思うような十分なセキュリティ管理ではないため、これらの文字をサポートする必要があり、コントロールが機能しない可能性があります。

JSONでHTML(スクリプトタグなど)を使用するリスクは、攻撃者が何らかの理由でユーザーを読み込んでブラウザにHTMLとして表示する可能性がある場合です。これは、コンテンツタイプのアプリケーション/ jsonが何であるかを知らなかったので、まったくまっすぐ進むことでした(< IE9)。したがって、ブラウザはコンテンツを推測しようとします。ただし、このタイプの盗聴は、ヘッダーX-Content-Type-Options: nosniffを使用して無効にすることができます。

あなたは

Content-Disposition: attachment;filename=data.json 
X-Download-Options: NoOpen 

を追加することで、さらに保護を強化することができ、ユーザがブラウザウィンドウに直接JSONを開こうとすると、ファイルが表示されているの代わりにダウンロードされます。

IMHO JSONでエンコーディングが不要です。

関連する問題