更新された回答
あなたの質問に答えて(私の最初の答えで少し接するのとは対照的に:D)、ここに私の意見があります:
1) これに関する私の主な意見は、嫌いだということd
です。API を使用するクライアントとして、私は混乱を招くと思います。とにかくそれは何の略ですか?データ?
他のオプションは良さそうです。Columns
ユーザーが要求したものをユーザーにミラーバックするため、優れています。
ページネーションを行っている場合、別のオプションは、コレクションのコンテンツ全体を受け取っていないことをクライアントに明らかにするようpage
なものかもしれません。slice
{
"offset": 0,
"limit": 100,
"page" : [
...
]
}
2) TBH、どちらの方法で行ってもそれほど大きな違いはないと思いますが、もし私だったら、封筒を返送する必要はないと思うので、おそらく気にしません (参照)。以下) そして、なぜ要求構造を必要以上に複雑にするのでしょうか?
封筒を返送するのはおかしいと思います。POST はアイテムをコレクションに追加できるようにする必要があるのに、なぜクライアントはこれを行うためにエンベロープをポストする必要があるのでしょうか?
エンベロープを PUT バックすることは、コレクション全体に関連付けられたメタデータを更新していると見なすことができるため、RESTful の観点からは理にかなっています。エンベロープで公開するメタデータの種類について考える価値があると思います。このエンベロープにうまく収まると思われるすべてのもの (ページネーション、集計、検索ファセット、および同様のメタデータなど) はすべて読み取り専用であるため、クライアントがこれをサーバーに送り返すことは意味がありません。クライアントが変更できるエンベロープに大量のデータがあることに気付いた場合は、そのデータをリストをサブコレクションとして別のリソースに分割する兆候である可能性があります。ごみの例:
/animals
{
"farmName": "farm",
"paging": {},
"animals": [
...
]
}
次のように分割できます。
/farm/1
{
"id": 1,
"farmName": "farm"
}
と
/farm/1/animals
{
"paging": {},
"animals": [
...
]
}
注: この分割があっても、 FacebookやLinkedIn のフィールド展開構文などを使用して、両方を組み合わせて 1 つの応答として返すことができます。例えばhttp://example.com/api/farm/1?field=animals.offset(0).limit(10)
クライアントが POST および PUT する JSON ペイロードがどのように見えるべきかをクライアントがどのように知る必要があるかについての質問に応えて、これは API ドキュメントに反映されている必要があります。これに適したツールがあるかどうかはわかりませんが、Swaggerは、 JSON スキーマを使用してリクエスト本文がどのように見えるべきかを文書化できる仕様を提供しています。スキーマを定義する方法についてはこのページを、方法についてはこのページを確認してください。それらを type のパラメーターとして参照します。残念ながら、Swagger はまだ洗練された Web UI でリクエスト ボディを視覚化していませんが、オープン ソースであるため、これを行うための何かをいつでも追加できます。 body
元の回答
そのページのディスカッション スレッドにあるWilliam のコメントを確認してください。彼は、エクスプロイトを完全に回避する方法を提案しています。つまり、応答のルートで JSON 配列を安全に使用できるため、どちらの質問についても心配する必要はありません。
リンク先のエクスプロイトは、Cookie を使用してユーザーのセッションを認証する API に依存しています。代わりにクエリ文字列パラメーターを使用するだけで、エクスプロイトを削除できます。API での認証に Cookie を使用することはあまり RESTful ではないため、おそらくこれを行う価値があります。クライアントの一部は Web ブラウザーではなく、Cookie を処理したくない場合があります。
なぜこの修正が機能するのですか?
エクスプロイトは CSRF 攻撃の一種であり、攻撃者がscript
自分のページのタグを API の機密リソースに追加できることに依存しています。
<script src="http://mysite.com/api/columns"></script>
被害者の Web ブラウザーは、保存されているすべての Cookiemysite.com
をサーバーに送信します。サーバーには、これが正当な要求のように見えますsession_id
。Cookie (またはサーバー側のフレームワークが Cookie を呼び出すもの) を確認し、ユーザーが認証されていることを確認します。リクエストは次のようになります。
GET http://mysite.com/api/columns
Cookie: session_id=123456789;
API を変更して Cookie を無視し、代わりに session_id クエリ文字列パラメーターを使用すると、攻撃者は被害者の Web ブラウザーをだまして API に session_id を送信させることができなくなります。
有効なリクエストは次のようになります。
GET http://mysite.com/api/columns?session_id=123456789
JavaScript クライアントを使用して上記のリクエストを行う場合、Cookie から session_id を取得できます。他のドメインの Cookie を取得できないため、別のドメインの JavaScript を使用する攻撃者はこれを行うことができません (こちら を参照)。
現在、問題を修正し、session_id Cookie を無視しています。攻撃者の Web サイトのスクリプト タグは、引き続き、次のような GET 行を含む同様のリクエストを送信します。
GET http://mysite.com/api/columns
403 Forbidden
ただし、必要な session_id クエリ文字列パラメーターが GET にないため、 サーバーは a で応答します。
この API でユーザーを認証していない場合はどうなりますか?
ユーザーを認証していない場合、データを機密にすることはできず、だれでも URI を呼び出すことができます。CSRF 攻撃を防いだとしても、認証がなければ、攻撃者は API サーバー側を呼び出してデータを取得し、好きなように使用できるため、CSRF は問題になりません。