Код: Выделить всё
respond_to :html, :json, :xml
def show
@thing = Thing.find(params[:id])
respond_with @thing
end
В этом конкретном примере действие «показать» на основе GET не требует каких-либо специальных мер безопасности. Теперь рассмотрим случай, аналогичный приведенному выше, но для таких действий, как «создать» или «обновить» — вещи, активируемые (симулированными) PUT или (фактическими) запросами POST. Теперь в игру вступает защита CSRF.
Здесь, к сожалению, Rails, похоже, предназначен только для обработки «вызовов API» (для ответов в формате, отличном от HTML) от Код JavaScript, исполняемый на веб-странице того же домена, для любого контроллера, который может передавать HTML-контент клиентам веб-браузера, где защита CSRF является обязательной. Код JavaScript может искать магический мета-тег, включенный в Rails, считывать токен CSRF и отправлять его обратно в вызовах XHR, которые вызывают действия на основе POST или аналогичные действия на сервере.
[*]http://weblog.rubyonrails.org/2011/2/8/ ... -on-rails/
А как насчет внешних звонков? Что, если у нас есть Rails, поддерживающий веб-сайт, но мы хотим создать собственное приложение для iOS или Android, которое взаимодействует с той же головной станцией? Это приложение будет выполнять служебные вызовы — хорошо, Rails упрощает это, — но любая попытка изменить данные на сервере потерпит неудачу, потому что у нас нет токена CSRF. Мы не можем просто обойти защиту CSRF, поскольку один и тот же код контроллера обрабатывает как веб-браузеры, так и клиенты «чистого API».
Все ответы по теме Проблемы CSRF с вызовами Rails и API, похоже, предполагают, что для таких случаев у вас будут разные контроллеры. Но это глупо - какой смысл во всех этих «упростить представление вашего приложения как службы», если они используются только для кода JavaScript на вашей веб-странице, если только вы не дублируете кучу кода в специальных контроллерах, которые просто обходят CSRF разрешить не-веб-клиентам? Такие дополнительные контроллеры только увеличивают поверхность атаки.
Знает ли кто-нибудь рекомендуемый «правильный» шаблон для защиты от CSRF в приложениях Rails, в которых есть действия, которые можно «назвать» ' обоими веб-браузерами или клиентами, не являющимися веб-браузерами, такими как собственные приложения iOS или Android? Встроенные функции, такие как «respond_with(...)», не делают ничего полезного, например, всегда генерируют объект JSON/XML, который включает токен CSRF в качестве вездесущего поля. Лучшее, что я могу придумать, это сделать это самому, например. визуализировать "@thing" как:
Код: Выделить всё
{
csrf: "abcdef...7890",
object: { ...JSON representation of @thing... }
}

Подробнее здесь: https://stackoverflow.com/questions/118 ... ts-such-as