web-dev-qa-db-ja.com

POSTをAPIでのみ使用するのは悪いことですか?

私たちのウェブサイト用の新しいAPIを開発しようとしています。 POSTおよびGETメソッドを使用することを検討した設計の一部ですが、いくつかのセキュリティ情報を読んだ後、GETはPOSTよりも少し安全ではない(つまり、ホットリンクを許可する)ことに気付きました。

では、私の質問は、なぜ安全性が低いのにAPIでGETを使用するのかということです。 "GET"は読み取りとPOST書き込み(つまりフォーム)に使用する必要があるというだけのレガシー概念です。GETメソッドは、画像URLまたはブックマークはできますが、APIにとって意味がありますか?同じメソッド(つまりPOST)を使用すると、メソッドについて心配する必要がないため、APIの一貫性も高まります。

私はRPC API(つまり、TwitterやFacebookなど)を計画しているので、HATEOS/RESTfulに反対することを望まないことを述べておきます。

では、私の質問は、なぜ安全性が低いのにAPIでGETを使用するのかということです。

人々はPOSTリクエストの使用がCSRFの解決策であると考えることがよくありますが、POSTリクエストは依然として脆弱であり、CSRF防止があなたの目標である場合、あなたは実装する必要があります CSRFトークン

ただし、CSRF攻撃の基本的な前提(つまり、1つのサイトが人間のアクションなしに別のサイトにリクエストを送信する)は実際には意図されているため、CSRFは通常APIに対する脅威とは見なされません。本当に簡単な例を挙げれば、mybank.com/transfermoneyにフォームを送信する悪意のあるサイトは、ユーザーが既にmybank.comの認証Cookieを設定しているため機能します。ただし、AJAXリクエストがmybank.com/transfermoneyに対して行われた場合、Cookieが送信されず、ユーザーがまだ認証されていないため、機能しません。

APIで認証するには、通常、認証トークン/キーのようなものを渡す必要があります。これは、攻撃者が認証済みのアクションを呼び出すためにCookieの値を知る必要がなかった他の例とは異なります。

GETとPOSTに関して、RESTfulインターフェースを実現しようとしている場合、GETとPOSTは異なる機能を持っています。リソースの取得(読み取り)にはGETを使用し、新しいリソースの送信にはPOSTを使用する必要があります。

4
thexacre