CSRF в приложении Rails, которое обслуживает HTML и предоставляет API для других клиентов, таких как iOS.IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 CSRF в приложении Rails, которое обслуживает HTML и предоставляет API для других клиентов, таких как iOS.

Сообщение Anonymous »

Среда Ruby On Rails включает функции, которые упрощают создание серверных приложений, предоставляющих API веб-служб. Например, контроллер делает следующее:

Код: Выделить всё

respond_to :html, :json, :xml

def show
@thing = Thing.find(params[:id])
respond_with @thing
end
... будет обрабатывать действия «показать» для обоих веб-браузеров, возвращая HTML, а также отображать элемент «@thing» как JSON или XML для запросов, которые указывают этот формат данных.

В этом конкретном примере действие «показать» на основе 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... }
}
... но это похоже на хак, довольно много работы, и, похоже, он обходит CSRF для world+dog, объявляя самый последний токен на в любом случае каждый запрос. Должен быть лучший способ :-)

Подробнее здесь: https://stackoverflow.com/questions/118 ... ts-such-as
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»