web-dev-qa-db-ja.com

404レスポンスに本文を含める必要があります

残りのAPIエラー応答を設計する際に、他の開発者が従うことを知りたいと思いました。

見つからなかったすべてのgetリソースについて、リソースが見つからなかったことを示す何らかのボディ、またはより詳細なレベルのエラーメッセージ、またはnullまたはblank応答のエラーコードのみを送信しますか?

2
Ashish

見つからないすべてのgetリソースについて、リソースが見つからなかったことを示す何らかのボディ、またはより詳細なレベルのエラーメッセージ、またはnullまたは空白の応答のエラーコードのみを送信しますか?

安全第一!

最初に考慮すべきことは、攻撃者はその情報を将来のより優れた攻撃の作成を含め、あらゆる目的に使用できるかどうかです。

プレリリースバージョンの.NETで、例外のエラーメッセージが基本的に "You don't have permission to know the name of directory C:\foo "。これは非常に役立つエラーメッセージですが、信頼性の低いコードから秘密を隠す目的に反します(この問題は、.NETのバージョンが顧客に出荷される前に検出および修正されました)。

特に、「存在しない」と「存在するが表示されない」を区別するエラーメッセージに注意してください。多くの場合、403 "forbidden"エラーを返さず、常に404 "not found"を返すことをお勧めします。

診断により、攻撃者が禁止されているものと見つからないものを区別できる場合、その違いを使用して、存在する可能性のあるリソースのスペースを徐々に列挙して、存在するリソースと存在しないリソースを判別できます。

私はこの脆弱性を1990年代にVBScriptに正確に導入しました。攻撃者は、これを区別するエラーメッセージをチェックすることにより、マシンのディレクトリ構造を徐々に学習するWebページを作成する可能性があります。ファイルを読み取ることはできませんでしたが、試行錯誤によってファイルとディレクトリの名前を特定することはできました。

したがって、WebベースのAPIの良い方法は安全モードに失敗するです。クライアントが認証され、信頼されていることがわかっている場合を除き、エラーメッセージでできるだけ少なくしますallエラーメッセージの情報。

10
Eric Lippert

404レスポンスが本文にコンテンツを含むことは非常に一般的です。最初の例は、Webサイトにアクセスしたときに、戻るまたはフロントページに移動するためのリンクが含まれた便利なHTMLページを取得する場合です。

API呼び出しが応答本文を返すべきではない理由はありません。実際、これは JSON:API仕様 が推奨するものです。主な理由は、サーバーが常にコンテンツを返す場合に、クライアント側のエラー処理コードを簡略化することです。

一方、JSON:API標準を使用していない場合は、情報に基づいた独自の決定を行うことができます。 HTTPステータスコードは、クライアントがリソースが存在しないことを知るのに十分な情報を提供します。唯一の欠点は、クライアントでのエラー処理が少し複雑になることです。

私が知っている唯一の戻りHTTPステータスコードには、コンテンツにリダイレクト用の3XXコードと204 No Contentコードが含まれるべきではないと明示的に述べています。

ボトムライン

Eric Lippertが警告するように、本文を返す場合は、提供するエラーメッセージが、ユーザーが知ることを許可されていない情報を共有していないことを確認してください。 404は、そのURLによるリソースがないことを示します。

私はコアAPIへのすべての呼び出しが認証されるシステムを使用しているので、誰が呼び出しを行っているかがわかり、それらがどのようなアクセス許可を持っているかは確実です。とは言っても、探しているリソースが見つからなかったことを示す一般的なエラーメッセージを含む本文を用意することをお勧めします。

5
Berin Loritsch

4xx(クライアントエラー) ステータスコードのクラスは、クライアントにエラーが発生したように見えることを示しています。 HEADリクエストに応答する場合を除いて、サーバーは、エラー状況の説明と、それが一時的な状態か永続的な状態かを含む表現を送信する必要があります(SHOULD)。

404 はもちろん4xxクラスのステータスコードであるため、リクエストの本文には( RFC 2119の意味で )メッセージ本文を含める必要があります。

応答には4xxステータスコードが含まれているため、汎用コンポーネントは(a)含まれている表現がエラーの表現であることを認識し、リソース自体は(b)エラー表現がキャッシュ可能かどうかを認識します( 404、デフォルトでは表現はキャッシュされます)。

RFC 7807 は、エラーの汎用通信用に設計されたメディアタイプapplication/problem+jsonについて説明します。

4
VoiceOfUnreason