Вопрос по ruby-on-rails-3.1, security, ios – безопасность безопасно отключить токены csrf для вызовов json rails?

6

У меня есть существующий веб-сайт rails backend, который делает вызовы json на сервер. Сейчас я разрабатываю мобильное приложение для iOS, чтобы использовать тот же бэкэнд и отправлять вызовы в формате json. Тем не менее, мобильные запросы не работают с:

WARNING: Can't verify CSRF token authenticity

Обращаясь к stackoverflow, многие предлагали отключить проверки csrf для вызовов json, используя что-то вроде этого:

# Or this in your application_controller.rb
def verified_request?
  if request.content_type == "application/json"
    true
  else
    super()
  end
end

Но мой вопрос, я не понимаю, как это предотвращает CSR-атаки в формате JSON? Атакующий всегда может отправить запрос json в нашу конечную точку со своего сайта. У кого-нибудь есть понимание этого? Я не смог найти четкого ответа на этот вопрос.

Ваш Ответ

3   ответа
1

Получите csrf_token из rails или, если используете что-то другое, из meta

// js file
var csrf_token = $('meta[name=csrf-token]').attr('content');

или же

//js.erb file
var csrf_token = "<%= request.session["<%= _csrf_token %>"] %>";

затем добавьте это в JS

$("body").bind("ajaxSend", function(elm, xhr, s){
   if (s.type == "POST") {
    // place lines mentioned above here
    // line goes here...
    xhr.setRequestHeader('X-CSRF-Token', csrf_token);
   }
});
@StingeyB, спасибо за ваш комментарий :-) Я добавил комментарий к последнему блоку кода, сообщая пользователю, где разместить строки, упомянутые выше. Это должно пережить предварительную компиляцию активов, согласитесь?
Пример JS может быть плохим, потому что вы собираетесь предварительно скомпилировать свои активы, и это не будет динамически восстановлено. Просто совет. Это может быть действительно страшно, потому что это будет работать в разработке, но не в производстве.
2

        var request:URLRequest = new URLRequest("http://stackoverflow.com"); 
        request.requestHeaders.push(new URLRequestHeader('Content-Type', 'application/json'));      
        request.data = unescape('{"a":1,"b":{"c":3}}');
        request.method = URLRequestMethod.POST;
        navigateToURL(request, '_blank');   

Если вы посмотрите наШпаргалка по профилактике CSRF  Вы можете проверить реферера, чтобы убедиться, что он принадлежит домену, которому вы доверяете. Если реферер пуст, то он может быть получен из URL-адреса https, поэтому это следует считать ошибкой. Использование токена CSRF в Ruby является более сильной формой защиты CSRF.

Спасибо, Ладья. Да, можно взломать JSON-звонки в CSRF. Глядя на эту страницу, я узнаю, кто может решить эту проблему. Но знаете ли вы, как я могу использовать токены CSRF, сгенерированные Rails, чтобы мобильное приложение могло использовать их и отправить запрос? Anish
@ Ладья, ты прав. Благодарю.
@ Anish Вы можете загрузить его, возможно, получить статический вызов get, который всегда возвращает токен.
& quot; вы можете проверить реферера, чтобы убедиться, что он принадлежит домену, которому вы доверяете. & quot; Конечно, они могут быть легко подделаны
@SooDesuNe Хотя подделать ВАШЕГО СОБСТВЕННОГО реферера тривиально, это невозможно сделать при атаке CSRF. Пожалуйста, ознакомьтесь с Шпаргалкой по профилактике CSRF, ссылка на которую приведена выше.
0

который вы можете предпринять, это оставить проверки CSRF, но отключить их в зависимости от наличия http-заголовка. Если ваши запросы json имеют токен JWT, вы можете сделать что-то подобное в соответствующих контроллерах.

protect_from_forgery with: :exception, unless: -> { some_auth_token.valid? }

Отправка форм не сможет установить заголовок http и, следовательно, csrf защитит его.

Вы JSON запросы должны иметьAuthorization заголовок, чтобы быть в безопасности.

Похожие вопросы