Rails показывает "ПРЕДУПРЕЖДЕНИЕ: Невозможно подтвердить аутентификацию CSRF-токена" из POST RestKit - программирование
Подтвердить что ты не робот

Rails показывает "ПРЕДУПРЕЖДЕНИЕ: Невозможно подтвердить аутентификацию CSRF-токена" из POST RestKit

Когда я пытаюсь выполнить 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];

Как я могу избавиться от предупреждения?

4b9b3361

Ответ 1

Вы можете безопасно удалить предупреждения со следующим:

skip_before_filter  :verify_authenticity_token

Это должно входить в каждый контроллер API Rails, который у вас есть, или если у вас есть base_controller для всех контроллеров API, тогда поставьте его там.

Если вы также можете получить доступ к своему приложению через веб-браузер, не помещайте эту строку в application_controller, поскольку вы будете создавать уязвимость безопасности.

Безопасно удалять csrf для вызовов API, поскольку конкретная уязвимость может выполняться только через веб-браузер.

Обновление 16 декабря 2013 года

Я видел некоторые ссылки на этот ответ и другой контент, который предлагает разъяснение. API может быть уязвим для CSRF, если вы используете методы проверки подлинности в Интернете для аутентификации API - например, сессий или файлов cookie.

В есть несколько хороших подробностей. Является ли ваш веб-API восприимчивым к эксплойту CSRF?.

Мой совет по-прежнему относится к пользователям RestKit, поскольку учетные данные пользователя вряд ли будут основаны на сеансах или файлах cookie, а скорее на именах пользователей или api.

Если ваш API может быть аутентифицирован с помощью сеанса или файлов cookie, вам следует избегать пропуска : verify_authenticity_token, и вам следует подумать о переходе на проверку подлинности на основе api.

Если ваш API может быть аутентифицирован с именем пользователя и паролем, который также используется для аутентификации в Интернете, все еще существует потенциальный эксплойт, хотя он менее серьезен, так как он потребует от пользователя ввода имени пользователя и пароля для вашего сайта в поле HTTP Auth при посещении сайта с помощью эксплойта. Опять же, для лучшей безопасности вы должны подумать о переходе на аутентификацию на основе api.

Стоит отметить, что я не согласен с тем, что вам нужно добавить :only => [:your_method] для дополнительной защиты, при условии, что у вас есть изолированные контроллеры api, ваш api не смешивается с вашими веб-ответами, и вы не используете сеанс или файлы cookie. Если они на месте, вы можете безопасно добавить skip_before_filter в base_controller для своего api.