web-dev-qa-db-ja.com

Railsは、RestKitから「警告:CSRFトークンの信頼性を検証できません」と表示しますPOST

POST from RestKitを実行しようとすると、Rails console:

Started POST "/friends" for 127.0.0.1 at 2012-04-16 09:58:10 +0800
Processing by FriendsController#create as */*
Parameters: {"friend"=>{"myself_id"=>"m001", "friend_id"=>"f001"}}
WARNING: Can't verify CSRF token authenticity
(0.1ms)  BEGIN
SQL (1.7ms)  INSERT INTO `friends` (`friend_id`, `myself_id`) VALUES ('f001', 'm001')
(1.1ms)  COMMIT
Redirected to http://127.0.0.1:3000/friends/8
Completed 302 Found in 6ms (ActiveRecord: 3.0ms)

これがクライアントコードです:

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
[attributes setObject: @"f001" forKey: @"friend_id"];
[attributes setObject: @"m001" forKey: @"myself_id"];
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:attributes forKey:@"friend"];
[[RKClient sharedClient] post:@"/friends" params:params delegate:self];

警告を取り除くにはどうすればよいですか?

22
ohho

次のようにして、警告を安全に削除できます。

skip_before_filter  :verify_authenticity_token

これは、お持ちのすべてのRails APIコントローラー、またはすべてのAPIコントローラーにbase_controllerがある場合はそこに配置する必要があります。

Webブラウザーからもアプリにアクセスできる場合は、この行をapplication_controllerに含めないでください。セキュリティの脆弱性が生じるためです。

特定の脆弱性はWebブラウザを介してのみ実行できるため、API呼び出しのcsrfを削除しても安全です。

2013年12月16日更新

この回答へのリンクと、説明を示唆するその他のコンテンツをいくつか見ました。 Webベースの認証方法を使用してAPIを認証する場合、APIはCSRFに対して脆弱になる可能性があります。セッションまたはCookie。

あなたのWeb APIはCSRFエクスプロイトの影響を受けやすいですか? に詳細がいくつかあります。

ユーザーの資格情報がセッションやCookieではなく、ユーザー名やAPIキーに基づいている可能性が低いため、私のアドバイスはRestKitのユーザーに代わるものです。

APIがセッションまたはCookieで認証できる場合は、: verify_authenticity_tokenのスキップを避け、APIキーベースの認証への移行を検討する必要があります。

Webでの認証にも使用されるユーザー名とパスワードでAPIを認証できる場合は、まだ悪用される可能性がありますが、ユーザーのサイトにユーザー名とパスワードを入力する必要があるため、それほど深刻ではありません。エクスプロイトでサイトにアクセスしている間のHTTP認証チャレンジボックス。繰り返しますが、最高のセキュリティを実現するには、APIキーベースの認証への移行を検討する必要があります。

分離されたAPIコントローラーがあり、APIがWeb応答と混合されておらず、セッションまたはCookieを使用していない場合、追加の保護のために:only => [:your_method]を追加する必要があることに同意しません。これらが適切に配置されている場合は、skip_before_filterをAPIのbase_controllerに安全に追加できます。

71
nmott