2017-06-03 6 views
0

私たちは、フロントエンドアプリケーションとasp.netコアウェブAPIバックエンドを備えた設定を持っています。 APIはjsonで応答します。 jsonプロパティをhtmlエンコードする必要がありますか?REST API - JSONコンテンツをHtmlEncodedにする必要がありますか?

私は両方の理由を見ることができます:プロとcon。

一方で、REST APIはクライアントに依存しないようにする必要があります(特に、htmlは特に気にする必要はありません)。一方、クライアント側のXSS予防のみに頼るのは少し危険です。

思考?

+0

これらの「近い」有権者から、ちょっとした推論を聞いてみると面白いでしょう。 –

答えて

1

いくつかのポイント:

  • 異なるエンコーディングが異なるコンテキストのために必要とされます。すべてのデータをhtmlエンコーディングで焼くことは、特にXSSに対して役に立たないJavascriptコンテキストに何らかの形で書き込むと、必ずしも良いとは限りません。だからこのような観点から、私はJSONをデータとして扱い、JSONエンコーディングとhtmlだけを必要とします。もちろん、クライアント側のデータバインディングなどは、エンコーディングや安全なバインディングを処理する必要があります。
  • JSONがAPI呼び出しで返された場合、応答のコンテンツタイプは非常に重要です。 などがある場合、jsonエンドポイント自体はXSSに対して脆弱です。
  • たとえば、変数を初期化するためにJSONデータをスクリプトブロックに書き込むと、トリッキーになります。次のことを考えてみましょう:
 
<script> 
    var data = "{'key1': 'val1', 'key2': 'val2'}"; 
</script> 

これは正常に見えるが、これを見てみましょう:

 
<script> 
    var data = "{'key1': 'val1', 'key2': '</script><script>alert(1)</script>'}"; 
</script> 

それは単純な文字列のように見えますが、ブラウザは主にHTMLパーサです。それは<スクリプト>と< /スクリプト>の間のものを見つけ、それをJavascriptとして実行します。文字列内の最初の</script>が最初の<script>タグとペアになり、文字列の最初のオープンタグが完全に新しいスクリプトを開始し、XSSとなります。

JSONをJavaScriptの一部としてhtmlに書き込む予定がある場合(非常に一般的な用途)、残念なことにJSONコンテンツをHTMLにエンコードする必要があります。これを避け、データを別々にダウンロードする方がはるかに優れています。

+0

これはいくつかの非常に良い点です!それに感謝します! content-typeは常にapplication/jsonです。もちろん、jsonがデータのみであるという理想も好きです(html以外のクライアントがapiを消費する場合は特に意味があります)。それで、もしあなたが正しくあなたを読むと、天気を決定するクライアントに向かってもっと傾いています。それは、jsonのいくつかの部分をhtmlencodeするかどうかですか? –

+0

はい、私はそれがjsonの構造自体がそのままであるように、json自体の値をエンコードすることとは別にエンコードすべきではないと思います。そこから、このデータの消費者の仕事は、それ以上のエンコーディングを処理することです。 xssに対するhtmlまたはjavascriptエンコードjson変数を初期化するためにjson変数をページに書きたい場合、json値のhtmlエンコーディングを行う1つの理由がありますが、これを避ける方が良いと思います。 –

+0

はい、私は同意します。私はあなたの投稿を回答としてマークし、一つの詳細を明確にするだけです:「js変数を初期化するためにjson値をページに書き込む」ということはどういう意味ですか?ありがとう! –

1

ええと、それについて考える必要がありましたが、私はやります: JSONの上に追加のHTMLエンコーディングはありません。適切なコンテンツタイプを設定していることを確認してください。特に安全でないと思われる「安全でない」データフィールドがある場合は、JSONを一般的に破棄することなく、ドキュメンテーション内のHTMLフィールドを、HTMLエンコードとして指定することができます。

だから、次の行の両方が細かいです:

{'data': '<script>alert(1)</script>'} # Normal, how I would do it 
{'data': '&lt;script&gt;alert(1)&lt;/script&gt;'} # unsafe data field which is documented as html encoded 
+0

私は完全には正確ではありませんでしたが、jsonの上ではなく、ただ(危険な)プロパティの上でエンコーディングを行うべきでないという良い点を作ってくれてありがとう。私はそれについて明示的に私の質問を更新しました。あなたの答えについては –

+0

、はい、これはオプションの1つです。その場合に起こる質問は、例えば、モバイルクリエンでそれを処理する方法ですか?また、クライアントでは、入力検証に関係なく、ストアドXSSタイプのため、すべてのプロパティを危険なものとして扱う必要があります。私は、人々が実際にすべての応答で2つのバージョンのjsonを返送する例を見てきました。それが良い考えであるかどうかは分かりません。 –

+1

私はよりクリーンなAPIを評価し、JSONのデータの完全な見た目を引き締めようとします。たとえば、注射の可能性を防ぐために、Validation Errorレスポンスに変数の入力を「エコーバック」しません。 (そしてはいのクライアントはすべてのフィールドを危険なものとして扱うべきです) – chickahoona

関連する問題