2016-10-12 2 views
0

Webアプリケーションには、文字を受け入れデータベースに格納するためのフィールドがいくつかあります。それらは後で取得され、JQueryバインディング、MVVMフレームワークなどいくつかの方法で表示されます。潜在的に危険な文字を受け入れ、ストアドXSSを防止する

このデータを受け入れて処理する正しい方法は何ですか?データが格納される前にサーバー側でデータをエンコードするか、元の形式で保存しますか?各レンダリング方法を分析してデータを安全に処理する方法を確認しますか?

答えて

1

TL; DR:後者ですが、XSSは出力エンコードの問題です。

データベースにユーザー入力を格納できます。それ自体は脆弱ではありません。もちろん可能な場合は、入力の検証を行う必要がありますが、通常の操作で期待するデータの性質のために、入力の一部を実際に検証することはできません。これは大きな問題ではないが、XSSは一般に入力の検証によって停止することはできない。

データベースにエンコードされた値を格納することに対する1つの主張は、それが懸念の分離であるということです。いくつかの異なるエンコーディング(HTML、Javascript、URL、XMLなど)があり、データを受け取るコンポーネントは、後でレンダリングするコンポーネントとは何の関係もないかもしれません。それに対するもう一つの議論は、データを格納するときにどのようにレンダリングされるか知りたくないので、適切なエンコーディングを選択できないということです。また、コード化されたデータでは、検索や順序付けがはるかに難しくなります。だから、それを受け取ったままで保存してください。

XSSを防止するためには、ある種の出力にそのようなデータを書き込むときに、コンテキスト(プレーンhtml、javascript、json、xmlなど)に従って出力エンコードを慎重に実装する必要があります。これはまったく単純ではありません。たとえば、HTMLページでは、スクリプトブロックだけでJavaScriptコンテキストを作成するのではなく、イベント属性(onclick、onmouseoverなど)も同様に、<>変数がhref値の最初の文字である場合(javascript:alert(1)を参照)、タグを使用します。

しかし結論としては、適切なエンコード方法を見つけて、出力に書き込むときにすべての変数をエンコードする必要があります。

MVVMは多少特殊なケースです。ほとんどのクライアント側のテンプレートには、エンコードされた変数または生の変数を書き込むメソッドがあります。また、クライアント側のデータバインディングでも、変数を解析されたhtmlノードまたはテキストとしてバインドする機能があります。明らかに、テキストを選択する必要があります.HTMLは、ユーザー入力が関係する場合、XSSに対して脆弱です。これは実質的に、html:の代わりにノックアウトでtext:バインディングを使用するか、.html()の代わりにjメソッドを使用するようなものを意味します。

このような場合、データは通常、AJAXリクエストとしてJSONとしてダウンロードされますが、まだ使用する場所がわからないため、エンコードする必要はありません。クライアントの検索/並べ替え(脆弱ではないためtext/htmlではなくapplication/jsonのコンテンツタイプで送信する必要があります)。しかしそれは単なるデータであり、JSONは単なるデータ形式です。もちろん、それはJSONにエンコードする必要がありますが、標準のオブジェクトシリアライザはそれを行います。 JSONをページに生成する場合(たとえばSPAを初期化する場合)、JSONオブジェクトの値をHTMLエンコードする必要があります。このデータをAJAXで取得する方が簡単で簡単です。

関連する問題