諸行無常

IT色々お勉強中のブログ

SPAのAPIのCSRF保護

翻訳自分で読むため、許可は取ってない

blog.eq8.eu

用語定義

https://railsguides.jp/security.html#%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA-csrf

  • この例では削除アクションにGETリクエストを使用していますが、ガイドラインのリンクで詳しく説明されているように、悪意のあるWebサイトにPOSTまたはDELETEリクエストをこのように送信させることが可能です。

  • 通常、「静的Webサイトからフォームを送信する」という文脈でCSRF攻撃保護が言及されています。私は最近、API呼び出しに関連するCSRF保護について詳しく読んでいましたが、さまざまなテクノロジのWeb開発者が言うのはあまりに一般的です。→「APIに対するCSRF攻撃保護は必要ありません。」

  • そのことを頭に入れて、通常彼らは、APIがブラウザ以外の他のクライアント技術(例えば、AndroidiPhone、あなたのスマート冷蔵庫)によって使われることが予想されるアプリケーションについて話しています。しかし、通常この文脈ではブラウザセッションを使用しません。 しかし、ブラウザセッションを使用するアプリケーション(例:Devise Gemを使用しているRuby on Rails開発者)がいなくて、そのアプリケーションがAPIと通信している場合は、CSRF保護が必要です。

結論

アプリケーションがセッション/クッキーを使用する場合は、CSRF保護が必要です。他の形式の認証(前述のAWSがCognitoを介してリクエストに署名したようなもの)がある場合は、CSRF保護は必要ありません。

Ruby on Rails WebフレームワークでCSRF APIを処理する方法

  • Railsにはprotect_from_forgeryメソッドがあります。これはコントローラに配置でき、CSRFトークンが提供されていない限りPOST PUT PATCH DELETE呼び出しが発生しないようにします。

  • しかし問題はこのトピックがRails Helperを使ってCSRFトークンをレンダリングする静的サイトを扱っていると仮定していることです<<= = csrf_meta_tags%>

  • しかし、シングルページアプリを扱うときは、最初のレンダリング時にのみ新鮮なcsrf-tokenがあることを意味します。

  • CSRFトークンをCookieに格納するようにバックエンドを設定し、その後FrontEndフレームワーク(Angular、React)がCookieから新しい値を取得するというソリューションを指している人々を見ました。

  • そのため、このようにしてhttp://www.webapp.com/project/1を削除する悪意のある要求がCSRF-TOKENなしで行われることになります=>は実行されません。

これを詳細に説明した良い情報源がすでにあるので、私は段階的なチュートリアルを書くつもりはないです:

https://technpol.wordpress.com/2014/04/17/rails4-angularjs-csrf-and-devise/ https://stackoverflow.com/questions/14734243/rails-csrf-protection-angular-js-protect-from-forgery-makes-me-to-log-out-on https://github.com/jsanders/angular_rails_csrf (gem solution) deep details how CSRF Rails protection work