Rails, OAuth и CSRF защита - PullRequest
       24

Rails, OAuth и CSRF защита

5 голосов
/ 03 декабря 2009

Я использую REST и OAuth для общения с приложением Rails (из приложения для iPhone, но это не должно быть актуально). Однако я сталкиваюсь с некоторыми проблемами с защитой CSRF в Rails (через protects_from_forgery).

Я понимаю, что защита CSRF включается только при регулярной отправке формы (т.е. Content-Type = application / x-www-form-urlencoded), поэтому мне было бы хорошо, если бы я отправлял данные JSON или XML. К сожалению, в настоящее время OAuth ограничен запросами application / x-www-form-urlencoded. Существует черновик спецификации , который расширяет OAuth до данных, не кодированных в форме , но это мне сейчас не помогает.

Как я вижу, у меня есть следующие варианты:

  1. Отправьте данные в формате JSON, зная, что они не будут частью подписи OAuth и, следовательно, будут подвергаться атакам типа «человек посередине». Очевидно, не очень привлекательное решение.

  2. Создание специальных действий Rails (например, UsersController#update_oauth), которые внутренне делегируют обычным действиям (например, UsersController#update). Затем исключите их из защиты от подделки (protects_from_forgery :only => [:update]). Это должно сработать и может быть приемлемо для одного или двух действий, но, очевидно, это будет очень грязное решение.

  3. Переопределить защиту Rails CSRF, чтобы игнорировать запросы OAuth. Я не пробовал этого, но похоже, что можно изменить один из хуков (возможно, фильтр verify_authenticity_token), чтобы считать запросы OAuth успешными.

Кто-нибудь сталкивался с этим раньше? Любые рекомендации? Или я что-то упускаю из виду?

1 Ответ

5 голосов
/ 03 декабря 2009

Я отвечу на свой вопрос. :)

Я добавил следующий метод в наши расширения контроллера OAuth. Единственное, что это добавляет к реализации по умолчанию, - это проверка oauth?. Это, кажется, делает свое дело и похоже на довольно чистое решение.

def verify_authenticity_token
  verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
end
...