質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

2回答

4363閲覧

RailsでXMLHttpRequestを使用しPOSTした際のCSRFについて

jnrzdr

総合スコア6

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

1クリップ

投稿2016/12/18 03:21

###シングルページアプリケーションでのCSRF対策
現在バックエンドにRails、フロントエンドにReactを使用したSPAの作成を行っております。
イニシャルページのみRailsがビューの生成を担当し、その後の通信はXMLHttpRequestを使用して行う設計です。
requestにはjqueryではなく、superagentやfetchを使用しています。
そのRailsにPOSTメソッドを送るとCSRFトークンでエラーになってしまいます。
ネット上で調べたところ、ほとんどの解決策が
ApplicationController内のprotect_from_forgery:null_sessionを設定するとのことでしたので、変更をした所確かにPOSTメソッドを送信することができました。
しかし、この方法はCSRFを無効にすることと同じのようですので、セキュリティ面に不安が残っています。ほとんどがapiによる通信の場合でしたら特に気にしなくても良いのでしょうか?
また、サーバーのログを見るとPOSTのアクションがあるとCan't verify CSRF token authenticity.と表示されていますが無視をしても良いのでしょうか?
もう一点気になることがあります、:null_sessionを指定してしまうと、POSTメソッドのアクション内でセッションがnilになってしまい、current_user(sessionを使用してログイン状態を判別している)との検証ができなくなってしまうのですが、何か対策はございますでしょうか?
根本的になにか勘違いをしていたら申し訳ありません。

kamedd👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

APIの場合CSRFを無効にしても良いかと思います。というよりせざるを得ないとおもいます

  • 不正なリクエストを防ぐ場合は認証の仕組みを厳重に行う(認証後はインスタントトークンでクライアントAPI間のやりとりを行うなど)
  • 不正なパラメータなどはstrong_parameterやvalidationなどの仕組みで防ぐ
  • DoS攻撃などが気になるんであれば、時間ごとのリクエスト数を制限する

などいかがでしょうか?

投稿2016/12/24 18:59

satoshih

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私もその問題に遭遇したことがあります。メタタグにあるCSRFキーを通信時に送ってあげることで解決しました。

ちなみに、私はセキュリティには全然詳しくないので、対処方法だけ書きます。

js

1function getCsrfToken() { 2 var meta = document.getElementsByTagName('meta'); 3 for (var elem in meta) { 4 if (meta[elem].name === 'csrf-token') { 5 return meta[elem].content; 6 } 7 } 8}

js

1//superagentは使ったことないので公式サンプルを改良 2//https://visionmedia.github.io/superagent/ 3request 4 .post('/api/pet') 5 .send({ name: 'Manny', species: 'cat' }) 6 .set('X-CSRF-Token', getCsrfToken()) //ここでヘッダーにトークンを追加する 7 .set('Accept', 'application/json') 8 .end(function(err, res){ 9 if (err || !res.ok) { 10 alert('Oh no! error'); 11 } else { 12 alert('yay got ' + JSON.stringify(res.body)); 13 } 14 });

最後に素人目線ですが、標準で付いている機能なのでそれをオフにしてしまうのは、良くない気がします。そういう攻撃があるため、対策しているわけですからね。

どっかのissueに書いてた気がするのですが、すぐにはみつからなかったので参考サイトは省略させていただきます。

投稿2016/12/18 06:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問