2017-12-08 12 views
1

私は、ユーザーがショッピングリストを作成したり、ショッピングリストを表示したり、ショッピングリストを共有したりできるシンプルなショッピングリストアプリケーションを用意しています。ユーザーが買い物リストを作成していないということは、xと言うことができますが、それは別のユーザーによって作成されたためデータベースにあります。このショッピングリストを作成しなかったユーザーにはどのステータスコードを返す必要がありますか?データベース内にあるので403である必要がありますが、このユーザーには閲覧権限がありません。また、ショッピングリストのこのユーザーコレクションには存在しないため、404である必要があります。返信するステータスコードは何ですか?

+0

ユーザーとの相対的なパスを設定します。 '/ users/{userId}/lists/{listId}'となります。 '/ users/{user1Id}/lists/{user2listId}'が404であるか、/ users/{user2Id}/lists/{anything} 'にアクセスするuser1が403であることは間違いありません。意味的に、現在のユーザーはそれを見るべきではありません。それは403です。 – jonrsharpe

答えて

1

あなたは404を返す必要があります:ユーザーが別のユーザーによって所有されているのと同じIDを持つ別のカートについて知るべきではありません。

戻り値403はセキュリティフローと見なされます。悪意のあるハッカーは連続するユーザーIDを使用してAPIを起動し、カートを所有するユーザーが見つかるまでセキュリティを向上させることができます。

+0

この場合、ショッピングリストはデータベースに追加され、shopping_listオブジェクトの 'owned_by'フィールドを使用してユーザーに関連します。ショッピングカートのようなものはありませんユーザー。あなたの答えはこの場合も同じですか? –

+1

はい、私の答えは、あなたがこのオブジェクトを与えるために選択した名前に関係なく、まだ立っています。 – alfasin

+1

カート所有者IDだけでなく 'owned_by'を確認するようにクエリを設定できるので、実際に実装する方が簡単です。つまり、クエリは空の結果セットを返し、アプリケーションは404で「自然に」応答します。 – alfasin

1

受け入れられた回答は完全に問題ありませんが、代わりに、IDが存在しない場合でもすべてのIDに対して403を送信することができます。そうすれば、セキュリティホールもありません。私はユーザが認証によって特定されていると仮定しており、/ lists/200がそれらのものであることを知っているので、200までのIDがおそらく存在します。/list/50と/ lists/50000000の両方が両方とも403を返した場合、ユーザーは誰も賢明ではありません。

この動作は、404プロキシを公開しているが403レスポンスを公開することはできないような、キャッシュプロキシのような仲介業者の面では安全かもしれません。

関連する問題