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];
警告を取り除くにはどうすればよいですか?
次のようにして、警告を安全に削除できます。
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
に安全に追加できます。