web-dev-qa-db-ja.com

JSON HTTP APIでの出力のエンコード

私はJSONの作成者ですREST API。これはREST APIは、HTML/JSクライアント、.NETクライアント(コンソールアプリケーション)およびRubyクライアント。APIの出力はJSON形式であるため、JSONルールに従ってフォーマットされ、必要な特殊文字はエスケープされます。

セキュリティ研究者から、<および>は出力でエスケープされないため、攻撃者がHTTPなどのリクエストを実行した場合、POST https ://my.api.example.com/blabla JSONボディ{Value:"<Hello>"}を使用すると、APIは{Response:"<Hello> is not a valid value"}のようなものを出力します。

次に、セキュリティ研究者は、攻撃者がこれを使用してリフレクトクロスサイトスクリプティングを実行できる可能性があることを説明しました。

私のJSON APIは常にContent-Type: application/jsonヘッダーを返すので、現代のクライアントはそれをHTMLとして解釈しようとしないことを理解しています。

<>は私のAPIで有効な文字なので、除外できません。 1つのオプションは、出力で文字をエンコードすることですが、JSON APIのHTMLエンコード文字は少し奇妙に思えます。 3番目のオプションは、出力から文字列を削除し、代わりに「指定された値が無効でした」のようなものを言うことですが、これは使いやすさを少し低下させます。

これを処理するための優れた一般的な方法はありますか?

6
Nitradamus

Content-Typeヘッダーに依存できますか?いいえ

このsecurity.stackexchange.comの質問 への回答で完全に述べたように、セキュリティに関しては、クライアントがコンテンツタイプヘッダーを尊重することはできません。

JSONのエンコード方法

OWASPがアドバイスを提供します まさにあなたの状況向け彼らは、コンテキストがHTMLであれば、そのコンテキストの出力をエンコードすると言っています。彼らはまた言います:

JavaScriptでJSONを直接エスケープおよびエスケープ解除する代わりに、ブラウザーに配信する前に「<」を「\ u003c」に変換してJSONをサーバー側で正規化します。

2
mcgyver5

これはある程度の意見の問題ですが、ここに脆弱性があることに同意しません。クライアントがサニテーションなしでJSON応答からのHTMLデータを反映する場合、それはAPIではなくそのクライアントの脆弱性です。どのWebページでも、API応答を信頼できないデータとして扱う必要があります。

応答をHTMLエンコードするのは悪い考えです。なぜAPIは、クライアントに適切なエンコードが何であるかを想定する必要があるのですか? HTML以外のコンテキストでデータが表示されるモバイルアプリのAPIを使用する場合はどうなりますか? HTMLエンコーディングは単に悪い設計です。サーバー側のクライアントの問題を解決します。

代わりに、出力にHTML特殊文字が含まれている可能性があること、およびクライアントが適切なアクションを実行する必要があることを明確に文書化します。

ただし、1つ重要な点として、スニフヘッダーを付けずに再応答してください。これがないと、MIMEスニッフィングブラウザーが応答をHTMLまたはJSとして解釈する可能性があり、これは実際の脆弱性です。

2
Anders

まず、ヘッダーは厳密に依存するものではありません。そして、この潜在的なXSS脆弱性は今のところ問題ではないかもしれませんが、APIが将来どのように使用されるかを正確に知ることはできません。どこかで、誰かが応答された値をHTMLで使用する可能性があるため、一部のXSSの可能性が開かれます。

これ自体は問題ではないかもしれませんが、入力を検証して出力を無害化する必要があります。

  • <>が入力で有効な文字になるシナリオは正確に何ですか? `
  • 以前に定義されたシナリオと一致しない入力がある場合は常に<>を削除するのに害がありますか?
  • 3番目のオプションを使用することは害になりますか?これはおそらく実装が最も簡単です。

何でもそうですが、OWASPには、XSS( 特にJSON )を防ぐ方法に関するWeb開発者向けの優れたガイド(チートシートと呼ばれます)があります。彼らのjson-sanitizerGitHubのプロジェクト もチェックする価値があるかもしれません。

0