23

から POST しようとするとRestKit、Rails コンソールに次の警告が表示されます。

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];

どうすれば警告を取り除くことができますか?

4

1 に答える 1

73

次の方法で警告を安全に削除できます。

skip_before_filter  :verify_authenticity_token

これは、あなたが持っているすべての Rails API コントローラーにbase_controller入れる必要があります。または、すべての API コントローラーを持っている場合は、そこに入れます。

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

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

2013 年 12 月 16 日更新

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

あなたの Web API は CSRF エクスプロイトの影響を受けやすいですか? に詳細が記載されています。.

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

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

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

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

于 2012-04-27T01:41:05.430 に答える